<!-- 博客 - 页面布局 > 上中下 -->



<!DOCTYPE html>
<html lang="zh-CN" data-default-color-scheme=dark>
<!-- 博客 - 导航栏上方 -->


<head>
  <meta charset="UTF-8">
  <link rel="apple-touch-icon" sizes="76x76" href="/blog/img/fluid.png">
  <link rel="icon" href="/blog/img/icon/dw.png">
  <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=5.0, shrink-to-fit=no">
  <meta http-equiv="x-ua-compatible" content="ie=edge">
  
  <meta name="theme-color" content="#2f4154">
  <meta name="author" content="Memory">
  <meta name="keywords" content="">

  
    <meta name="description" content="🍛 逐步学习Linux基础命令，包括文本处理、文件压缩、系统监控等，助你在命令行环境下发挥更大的能力">
<meta property="og:type" content="article">
<meta property="og:title" content="掌握Linux基础命令：入门到实践">
<meta property="og:url" content="https://test.atomgit.net/blog/2023/03/22/%E6%8E%8C%E6%8F%A1%20Linux%20%E5%9F%BA%E7%A1%80%E5%91%BD%E4%BB%A4%EF%BC%9A%E5%85%A5%E9%97%A8%E5%88%B0%E5%AE%9E%E8%B7%B5/index.html">
<meta property="og:site_name" content="Memory&#39;s blog">
<meta property="og:description" content="🍛 逐步学习Linux基础命令，包括文本处理、文件压缩、系统监控等，助你在命令行环境下发挥更大的能力">
<meta property="og:locale" content="zh_CN">
<meta property="og:image" content="https://test.atomgit.net/blog/img/artical/cat20240729.jpg">
<meta property="article:published_time" content="2023-03-22T13:31:48.000Z">
<meta property="article:modified_time" content="2024-09-26T03:07:48.000Z">
<meta property="article:author" content="Memory">
<meta property="article:tag" content="经验">
<meta property="article:tag" content="Linux">
<meta property="article:tag" content="操作系统">
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:image" content="https://test.atomgit.net/blog/img/artical/cat20240729.jpg">
  
  
  
  <title>掌握Linux基础命令：入门到实践 - Memory&#39;s blog</title>

  <link  rel="stylesheet" href="https://lib.baomitu.com/twitter-bootstrap/4.6.1/css/bootstrap.min.css" />



  <link  rel="stylesheet" href="https://lib.baomitu.com/github-markdown-css/4.0.0/github-markdown.min.css" />

  <link  rel="stylesheet" href="https://lib.baomitu.com/hint.css/2.7.0/hint.min.css" />

  <link  rel="stylesheet" href="https://lib.baomitu.com/fancybox/3.5.7/jquery.fancybox.min.css" />



<!-- 主题依赖的图标库，不要自行修改 -->
<!-- Do not modify the link that theme dependent icons -->

<link rel="stylesheet" href="//at.alicdn.com/t/font_1749284_hj8rtnfg7um.css">



<link rel="stylesheet" href="//at.alicdn.com/t/font_1736178_lbnruvf0jn.css">


<link  rel="stylesheet" href="/blog/css/main.css" />


  <link id="highlight-css" rel="stylesheet" href="/blog/css/highlight.css" />
  
    <link id="highlight-css-dark" rel="stylesheet" href="/blog/css/highlight-dark.css" />
  



  
<link rel="stylesheet" href="//cdn.jsdelivr.net/npm/aplayer/dist/APlayer.min.css">



  <script id="fluid-configs">
    var Fluid = window.Fluid || {};
    Fluid.ctx = Object.assign({}, Fluid.ctx)
    var CONFIG = {"hostname":"test.atomgit.net","root":"/blog/","version":"1.9.4","typing":{"enable":true,"typeSpeed":100,"cursorChar":"_","loop":false,"scope":[]},"anchorjs":{"enable":true,"element":"h1,h2,h3,h4,h5,h6","placement":"left","visible":"hover","icon":""},"progressbar":{"enable":true,"height_px":3,"color":"#29d","options":{"showSpinner":false,"trickleSpeed":100}},"code_language":{"enable":true,"default":"TEXT"},"copy_btn":true,"image_caption":{"enable":true},"image_zoom":{"enable":true,"img_url_replace":["",""]},"toc":{"enable":true,"placement":"right","headingSelector":"h1,h2,h3,h4,h5,h6","collapseDepth":0},"lazyload":{"enable":false,"loading_img":"/img/loading.gif","onlypost":false,"offset_factor":2},"web_analytics":{"enable":true,"follow_dnt":true,"baidu":null,"google":null,"gtag":null,"tencent":{"sid":null,"cid":null},"woyaola":null,"cnzz":null,"leancloud":{"appId":"T1hUHH9Ks1ggG9DBE3HgUPpV-gzGzoHsz","appKey":"XFkgzzvzNo3J3uNCbBiSOFKc","server_url":"https://t1huhh9k.lc-cn-n1-shared.com","path":"window.location.pathname","ignore_local":false}},"search_path":"/blog/local-search.xml"};

    if (CONFIG.web_analytics.follow_dnt) {
      var dntVal = navigator.doNotTrack || window.doNotTrack || navigator.msDoNotTrack;
      Fluid.ctx.dnt = dntVal && (dntVal.startsWith('1') || dntVal.startsWith('yes') || dntVal.startsWith('on'));
    }
  </script>
  <script  src="/blog/js/utils.js" ></script>
  <script  src="/blog/js/color-schema.js" ></script>
  

  

  

  

  

  

  

  



  
<meta name="generator" content="Hexo 5.4.2"></head>

<body>
  

  <header>
    <!-- 博客 - 导航栏上方 -->


<div class="header-inner" style="height: 100vh">
  <nav id="navbar" class="navbar fixed-top  navbar-expand-lg navbar-dark scrolling-navbar">
  <div class="container">
    <a class="navbar-brand" href="/blog/">
      <strong>Memory&#39;s blog</strong>
    </a>

    <button id="navbar-toggler-btn" class="navbar-toggler" type="button" data-toggle="collapse"
            data-target="#navbarSupportedContent"
            aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
      <div class="animated-icon"><span></span><span></span><span></span></div>
    </button>

    <!-- Collapsible content -->
    <div class="collapse navbar-collapse" id="navbarSupportedContent">
      <ul class="navbar-nav ml-auto text-center">
        
          
          
          
          
            <li class="nav-item">
              <a class="nav-link" href="/blog/">
                <i class="iconfont icon-home-fill"></i>
                <span>首页</span>
              </a>
            </li>
          
        
          
          
          
          
            <li class="nav-item">
              <a class="nav-link" href="/blog/archives/">
                <i class="iconfont icon-archive-fill"></i>
                <span>归档</span>
              </a>
            </li>
          
        
          
          
          
          
            <li class="nav-item">
              <a class="nav-link" href="/blog/categories/">
                <i class="iconfont icon-category-fill"></i>
                <span>分类</span>
              </a>
            </li>
          
        
          
          
          
          
            <li class="nav-item">
              <a class="nav-link" href="/blog/tags/">
                <i class="iconfont icon-tags-fill"></i>
                <span>标签</span>
              </a>
            </li>
          
        
          
          
          
          
            <li class="nav-item">
              <a class="nav-link" href="/blog/about/">
                <i class="iconfont icon-user-fill"></i>
                <span>关于</span>
              </a>
            </li>
          
        
          
          
          
          
            <li class="nav-item">
              <a class="nav-link" href="/blog/links/">
                <i class="iconfont icon-link-fill"></i>
                <span>友链</span>
              </a>
            </li>
          
        
          
          
          
          
            <li class="nav-item">
              <a class="nav-link" href="/blog/playlist/">
                <i class="iconfont icon-music"></i>
                <span>音乐</span>
              </a>
            </li>
          
        
          
          
          
          
            <li class="nav-item">
              <a class="nav-link" href="/blog/Memos/">
                <i class="iconfont icon-comment "></i>
                <span>说说</span>
              </a>
            </li>
          
        
          
          
          
          
            <li class="nav-item">
              <a class="nav-link" href="/blog/App/">
                <i class="iconfont icon-mobile"></i>
                <span>咫尺</span>
              </a>
            </li>
          
        
          
          
          
          
            <li class="nav-item dropdown">
              <a class="nav-link dropdown-toggle" target="_self" href="javascript:;" role="button"
                 data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
                <i class="iconfont icon-books"></i>
                <span>青简</span>
              </a>
              <div class="dropdown-menu" aria-labelledby="navbarDropdown">
                
                  
                  
                  
                  <a class="dropdown-item" target="_blank" rel="noopener" href="http://47.93.135.62:5230/explore">
                    <i class="iconfont icon-images"></i>
                    <span>碎念微光</span>
                  </a>
                
                  
                  
                  
                  <a class="dropdown-item" href="/blog/New/">
                    <i class="iconfont icon-bug"></i>
                    <span>匠册详析</span>
                  </a>
                
                  
                  
                  
                  <a class="dropdown-item" href="/blog/New/">
                    <i class="iconfont icon-xbox-fill"></i>
                    <span>窗景新编</span>
                  </a>
                
                  
                  
                  
                  <a class="dropdown-item" href="/blog/New/">
                    <i class="iconfont icon-steam"></i>
                    <span>戏码幕后</span>
                  </a>
                
                  
                  
                  
                  <a class="dropdown-item" href="/blog/New/">
                    <i class="iconfont icon-map"></i>
                    <span>他山随拾</span>
                  </a>
                
              </div>
            </li>
          
        
        
            <li class="nav-item" id="search-btn">
                <a class="nav-link" target="_self" href="javascript:;" data-toggle="modal" data-target="#modalNotice" aria-label="Search">
                    <i class="iconfont icon-book"></i>
                    <span>公告</span>
                </a>
            </li>
            
        
        
          <li class="nav-item" id="search-btn">
            <a class="nav-link" target="_self" href="javascript:;" data-toggle="modal" data-target="#modalSearch" aria-label="Search">
              <i class="iconfont icon-search"></i>
            </a>
          </li>
          
        
        
          <li class="nav-item" id="color-toggle-btn">
            <a class="nav-link" target="_self" href="javascript:;" aria-label="Color Toggle">
              <i class="iconfont icon-dark" id="color-toggle-icon"></i>
            </a>
          </li>
        
      </ul>
    </div>
  </div>
</nav>
 
<div id="banner" class="banner" parallax=true
     style="background: url('/blog/img/artical/cat20240729.jpg') no-repeat center center; background-size: cover;">
  <div class="full-bg-img">

    <div class="mask flex-center" style="background-color: rgba(0, 0, 0, 0.3)">
      <div class="banner-text text-center fade-in-up">

        <div class="h2">
          
            <span id="subtitle" data-typed-text="掌握Linux基础命令：入门到实践"></span>
          
        </div>


        
          <!-- 文章页面 - 顶部信息 -->

<div class="mt-3">
  
  <span class="post-meta mr-2">
    <i class="iconfont icon-author" aria-hidden="true"></i>
    Memory
  </span>
   
  <span class="post-meta">
    <i class="iconfont icon-date-fill" aria-hidden="true"></i>
    <time datetime="2023-03-22 21:31" pubdate>
      2023年3月22日 晚上
    </time>
  </span>
  
</div>

<div class="mt-1">
  
  <span class="post-meta mr-2">
    <i class="iconfont icon-chart"></i>
     18k 字 
  </span>
   
  <span class="post-meta mr-2">
    <i class="iconfont icon-clock-fill"></i>
       45 分钟 
  </span>
     
  <span
    id="leancloud-page-views-container"
    class="post-meta"
    style="display: none"
  >
    <i class="iconfont icon-eye" aria-hidden="true"></i>
    <span id="leancloud-page-views"></span> 次
  </span>

    
</div>


        

        <!-- 添加网站运行时间 -->
        <div class="footer-content" style="background-color: transparent;">
          <div>
            <span id="timeDate"></span>
            <span id="times"></span>
            <script>
            var now = new Date();
            function createtime(){
                var grt= new Date("03/07/2023 00:00:00");//此处修改你的建站时间或者网站上线时间
                now.setTime(now.getTime()+250);
                days = (now - grt ) / 1000 / 60 / 60 / 24;
                dnum = Math.floor(days);
                hours = (now - grt ) / 1000 / 60 / 60 - (24 * dnum);
                hnum = Math.floor(hours);
                if(String(hnum).length ==1 ){
                    hnum = "0" + hnum;
                }
                minutes = (now - grt ) / 1000 /60 - (24 * 60 * dnum) - (60 * hnum);
                mnum = Math.floor(minutes);
                if(String(mnum).length ==1 ){
                          mnum = "0" + mnum;
                }
                seconds = (now - grt ) / 1000 - (24 * 60 * 60 * dnum) - (60 * 60 * hnum) - (60 * mnum);
                snum = Math.round(seconds);
                if(String(snum).length ==1 ){
                          snum = "0" + snum;
                }
                document.getElementById("timeDate").innerHTML = "🚀 &nbsp"+dnum+"&nbsp天";  //此次自定义显示内容
                document.getElementById("times").innerHTML = hnum + "&nbsp小时&nbsp" + mnum + "&nbsp分&nbsp" + snum + "&nbsp秒";
            }  

            if (!window.location.href.includes('/20')) {  
            setInterval("createtime()", 250);  // 只有当URL不包含'specific-page'时，才调用createtime  
            }//此次自定义显示内容
            </script>
          </div>
        </div>

      </div>
      
        <div class="scroll-down-bar">
          <i class="iconfont icon-arrowdown"></i>
        </div>
      
    </div>
  </div>
</div>

</div>

  </header>

  <main>
    
      <!-- 文章页  -->


<div class="container-fluid nopadding-x">

  <div class="row nomargin-x">
    <div class="side-col d-none d-lg-block col-lg-2">
      
  <aside class="sidebar category-bar" style="margin-right: -1rem">
    <!-- 文章页面 - 左边栏所属分类 -->
  

<!-- 文章页 - 文章分类 -->





<div class="category-list">
  
  
    
    
    
    <div class="category row nomargin-x">
      <a class="category-item 
          list-group-item category-item-action col-10 col-md-11 col-xm-11" title="部署之道"
        id="heading-36acf247b1a64f4bbe423776a392cfde" role="tab" data-toggle="collapse" href="#collapse-36acf247b1a64f4bbe423776a392cfde"
        aria-expanded="true"
      >
        部署之道
        <span class="list-group-count">(7)</span>
        <i class="iconfont icon-arrowright"></i>
      </a>
      
      <div class="category-collapse collapse show" id="collapse-36acf247b1a64f4bbe423776a392cfde"
           role="tabpanel" aria-labelledby="heading-36acf247b1a64f4bbe423776a392cfde">
        
        
          
  <div class="category-post-list">
    
    
      
      
        <a href="/blog/2023/03/22/%E6%8E%8C%E6%8F%A1%20Linux%20%E5%9F%BA%E7%A1%80%E5%91%BD%E4%BB%A4%EF%BC%9A%E5%85%A5%E9%97%A8%E5%88%B0%E5%AE%9E%E8%B7%B5/" title="掌握Linux基础命令：入门到实践"
           class="list-group-item list-group-item-action
           active">
          <span class="category-post">掌握Linux基础命令：入门到实践</span>
        </a>
      
    
      
      
        <a href="/blog/2023/06/04/%E6%8F%AD%E7%A7%98%E9%A1%B9%E7%9B%AE%E9%83%A8%E7%BD%B2%E4%B8%8A%E7%BA%BF%E4%B9%8B%E8%B7%AF%EF%BC%9A%E6%B5%81%E7%A8%8B%E3%80%81%E6%8C%91%E6%88%98%E4%B8%8E%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88/" title="稳中求胜：从混乱到规范，让项目部署不再手忙脚乱"
           class="list-group-item list-group-item-action
           ">
          <span class="category-post">稳中求胜：从混乱到规范，让项目部署不再手忙脚乱</span>
        </a>
      
    
      
      
        <a href="/blog/2023/06/20/%E4%BA%91%E6%9C%8D%E5%8A%A1%E5%99%A8%E8%B4%AD%E4%B9%B0%E4%B8%8E%E5%A4%87%E6%A1%88%E6%B5%81%E7%A8%8B%E8%AF%A6%E8%A7%A3%EF%BC%9A%E4%B8%80%E6%AD%A5%E6%AD%A5%E8%BD%BB%E6%9D%BE%E4%B8%8A%E6%89%8B/" title="云服务器购买与备案流程详解：一步步轻松上手"
           class="list-group-item list-group-item-action
           ">
          <span class="category-post">云服务器购买与备案流程详解：一步步轻松上手</span>
        </a>
      
    
      
      
        <a href="/blog/2023/06/20/%E4%BA%91%E6%9C%8D%E5%8A%A1%E5%99%A8%E8%BF%9C%E7%A8%8B%E8%BF%9E%E6%8E%A5%E6%8C%87%E5%8D%97%EF%BC%9A%E5%90%84%E7%A7%8D%E6%96%B9%E6%B3%95%E8%AF%A6%E8%A7%A3%E4%B8%8E%E9%97%AE%E9%A2%98%E8%A7%A3%E5%86%B3/" title="云服务器远程连接指南：各种方法详解与问题解决"
           class="list-group-item list-group-item-action
           ">
          <span class="category-post">云服务器远程连接指南：各种方法详解与问题解决</span>
        </a>
      
    
      
      
        <a href="/blog/2023/06/20/%E5%AE%9D%E5%A1%94%E9%9D%A2%E6%9D%BF%E5%AE%89%E8%A3%85%E6%95%99%E7%A8%8B/" title="宝塔面板安装教程"
           class="list-group-item list-group-item-action
           ">
          <span class="category-post">宝塔面板安装教程</span>
        </a>
      
    
      
      
        <a href="/blog/2023/06/20/%E5%AE%9D%E5%A1%94%E9%9D%A2%E6%9D%BF%EF%BC%9A%E8%A7%A3%E6%94%BE%E6%89%8B%E5%8A%A8%E9%85%8D%E7%BD%AE%EF%BC%8C%E8%BD%BB%E6%9D%BE%E7%AE%A1%E7%90%86%E4%BD%A0%E7%9A%84%E6%9C%8D%E5%8A%A1%E5%99%A8/" title="宝塔面板：解放手动配置，轻松管理你的服务器"
           class="list-group-item list-group-item-action
           ">
          <span class="category-post">宝塔面板：解放手动配置，轻松管理你的服务器</span>
        </a>
      
    
      
      
        <a href="/blog/2023/07/30/%E4%B8%80%E6%96%87%E6%90%9E%E5%AE%9A%E7%BD%91%E7%AB%99%E4%B8%8A%E7%BA%BF%EF%BC%9A%E4%BB%8E%E9%9B%B6%E5%88%B0%E4%B8%80%E7%9A%84%E5%AE%9E%E6%88%98%E6%8C%87%E5%8D%97/" title="一文搞定网站上线：从零到一的实战指南"
           class="list-group-item list-group-item-action
           ">
          <span class="category-post">一文搞定网站上线：从零到一的实战指南</span>
        </a>
      
    
  </div>

        
      </div>
    </div>
  
</div>

  </aside>


    </div>

    <div class="col-lg-8 nopadding-x-md">
      <div class="container nopadding-x-md" id="board-ctn">
        <div id="board">
          <article class="post-content mx-auto">
            <!-- SEO header -->
            <h1 style="display: none">掌握Linux基础命令：入门到实践</h1>
            
              <p class="note note-success">
                
                  
                    本文最后更新于：1 年前
                  
                
              </p>
            
            
              <div class="markdown-body">
                
                <h1 id="导言"><a href="#导言" class="headerlink" title="导言"></a>导言</h1><ul>
<li><h5 id="Linux-是一种开源操作系统，它提供了丰富的命令行工具来管理和操作系统"><a href="#Linux-是一种开源操作系统，它提供了丰富的命令行工具来管理和操作系统" class="headerlink" title="Linux 是一种开源操作系统，它提供了丰富的命令行工具来管理和操作系统"></a>Linux 是一种开源操作系统，它提供了丰富的命令行工具来管理和操作系统</h5></li>
<li><h5 id="本文将快速介绍一些常用的-Linux-命令"><a href="#本文将快速介绍一些常用的-Linux-命令" class="headerlink" title="本文将快速介绍一些常用的 Linux 命令"></a>本文将快速介绍一些常用的 Linux 命令</h5></li>
<li><p>Linux 命令在线速查手册：<a target="_blank" rel="noopener" href="https://wangchujiang.com/linux-command/">Linux 命令在线速查手册</a> ✔<strong>（2023/11/11 早）</strong></p>
</li>
</ul>
<p><a target="_blank" rel="noopener" href="https://blog.csdn.net/aahwj/article/details/132819154">Linux 系统下 Node.js 的安装步骤_linux 安装 node.js-CSDN 博客</a></p>
<p><a target="_blank" rel="noopener" href="http://www.hostbuf.com/?install_fs">FinalShell 官网 (hostbuf.com)</a></p>
<h1 id="正文"><a href="#正文" class="headerlink" title="正文"></a>正文</h1><h2 id="一次性学会-68-个常用命令"><a href="#一次性学会-68-个常用命令" class="headerlink" title="一次性学会 68 个常用命令"></a>一次性学会 68 个常用命令</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs BASH"><span class="hljs-built_in">ls</span> -l -a<br></code></pre></td></tr></table></figure>

<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-built_in">cd</span> /  <span class="hljs-built_in">cd</span> /root    <span class="hljs-built_in">cd</span> /home/memory<br></code></pre></td></tr></table></figure>

<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-built_in">pwd</span><br></code></pre></td></tr></table></figure>

<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-built_in">touch</span> atext btext c<br></code></pre></td></tr></table></figure>

<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-built_in">cat</span> sb.txt<br></code></pre></td></tr></table></figure>

<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-built_in">echo</span> 哈哈哈	<span class="hljs-built_in">echo</span> how are you &gt; sb.txt<br></code></pre></td></tr></table></figure>

<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">nano sb.txt<br></code></pre></td></tr></table></figure>

<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">vim sb.txt<br></code></pre></td></tr></table></figure>

<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-built_in">shred</span> 慎用，转换文本为乱码，但是操作菜单都成乱码了，只能重启<br></code></pre></td></tr></table></figure>

<figure class="highlight arduino"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs arduino">mkdir newdic<br></code></pre></td></tr></table></figure>

<figure class="highlight haxe"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs haxe">cp atext <span class="hljs-keyword">new</span><span class="hljs-type">dic</span> atext2<br></code></pre></td></tr></table></figure>

<figure class="highlight haxe"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs haxe">mv btext c <span class="hljs-keyword">new</span><span class="hljs-type">dic</span>/<br></code></pre></td></tr></table></figure>

<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-built_in">rm</span> dfsfff<br></code></pre></td></tr></table></figure>

<figure class="highlight haxe"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs haxe">rmdir <span class="hljs-keyword">new</span><span class="hljs-type">dir</span>/<br></code></pre></td></tr></table></figure>

<figure class="highlight haxe"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs haxe">rm -R <span class="hljs-keyword">new</span><span class="hljs-type">dir</span>/  递归删除目录<br></code></pre></td></tr></table></figure>

<p><img src="http://blog.memory-life.xyz/image-20231004142717334.png" alt="image-20231004142717334"></p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-built_in">ln</span> -s ../sb.txt sb3.txt<br></code></pre></td></tr></table></figure>

<p><img src="http://blog.memory-life.xyz/image-20231004143207735.png" alt="image-20231004143207735"></p>
<figure class="highlight arduino"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs arduino">clear<br></code></pre></td></tr></table></figure>

<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-built_in">whoami</span><br></code></pre></td></tr></table></figure>

<figure class="highlight ebnf"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs ebnf"><span class="hljs-attribute">useradd tom</span><br></code></pre></td></tr></table></figure>

<figure class="highlight ebnf"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs ebnf"><span class="hljs-attribute">adduser mike</span><br></code></pre></td></tr></table></figure>

<figure class="highlight ebnf"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs ebnf"><span class="hljs-attribute">sudo useradd tom</span><br></code></pre></td></tr></table></figure>

<figure class="highlight stata"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs stata"><span class="hljs-keyword">su</span> root		<span class="hljs-keyword">su</span> tom<br></code></pre></td></tr></table></figure>

<figure class="highlight ebnf"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs ebnf"><span class="hljs-attribute">sudo passwd nick</span><br></code></pre></td></tr></table></figure>

<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">whatis <span class="hljs-built_in">pwd</span>		后面加个命令，他会告诉你这个命令是干啥用的<br></code></pre></td></tr></table></figure>

<p><img src="http://blog.memory-life.xyz/image-20231004145302771.png" alt="image-20231004145302771"></p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-built_in">which</span> <span class="hljs-built_in">pwd</span><br></code></pre></td></tr></table></figure>

<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">whereis <span class="hljs-built_in">pwd</span><br></code></pre></td></tr></table></figure>

<p><img src="http://blog.memory-life.xyz/image-20231004145241428.png" alt="image-20231004145241428"></p>
<figure class="highlight ebnf"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs ebnf"><span class="hljs-attribute">wget</span><br></code></pre></td></tr></table></figure>

<figure class="highlight ebnf"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs ebnf"><span class="hljs-attribute">curl</span><br></code></pre></td></tr></table></figure>

<figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs python"><span class="hljs-built_in">zip</span> xxx.<span class="hljs-built_in">zip</span>  myapp		压缩<br></code></pre></td></tr></table></figure>

<figure class="highlight nginx"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs nginx"><span class="hljs-attribute">unzip</span> xxx.zip 		解压<br></code></pre></td></tr></table></figure>

<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-built_in">cat</span> less <span class="hljs-built_in">head</span> <span class="hljs-built_in">tail</span><br></code></pre></td></tr></table></figure>

<figure class="highlight armasm"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs armasm"><span class="hljs-keyword">cmp</span> c.txt <span class="hljs-built_in">sb</span>.txt		比较两文件是否相同<br></code></pre></td></tr></table></figure>

<figure class="highlight mipsasm"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs mipsasm"><span class="hljs-keyword">diff </span>c.txt <span class="hljs-keyword">sb.txt	</span>	更详细的比较<br></code></pre></td></tr></table></figure>

<p><img src="http://blog.memory-life.xyz/image-20231004145843352.png" alt="image-20231004145843352"></p>
<figure class="highlight vim"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs vim"><span class="hljs-keyword">cat</span> <span class="hljs-keyword">sb</span>.txt | <span class="hljs-keyword">sort</span>		排序显示文本<br></code></pre></td></tr></table></figure>

<p><img src="http://blog.memory-life.xyz/image-20231004150036403.png" alt="image-20231004150036403"></p>
<figure class="highlight routeros"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs routeros"><span class="hljs-built_in">find</span> / -name <span class="hljs-string">&quot;a&quot;</span>   sudo <span class="hljs-built_in">find</span> / -name <span class="hljs-string">&quot;a&quot;</span>		按文件名查找，指定目录<br></code></pre></td></tr></table></figure>

<figure class="highlight routeros"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs routeros"><span class="hljs-built_in">find</span> -name <span class="hljs-string">&quot;a&quot;</span>		默认当前目录下<br></code></pre></td></tr></table></figure>

<figure class="highlight routeros"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs routeros"><span class="hljs-built_in">find</span> -name <span class="hljs-string">&quot;a*&quot;</span>	   <span class="hljs-built_in">find</span> -name <span class="hljs-string">&quot;*a&quot;</span>		通配符 以a为开头 / 以a为结尾<br></code></pre></td></tr></table></figure>

<figure class="highlight llvm"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs llvm">chmod +<span class="hljs-keyword">x</span> <span class="hljs-keyword">c</span>.txt    修改权限<br></code></pre></td></tr></table></figure>

<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-built_in">chown</span>	修改所有权<br></code></pre></td></tr></table></figure>

<figure class="highlight mipsasm"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs mipsasm"><span class="hljs-keyword">ll </span> 查看详细信息，包括文件所有权<br></code></pre></td></tr></table></figure>

<figure class="highlight ebnf"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs ebnf"><span class="hljs-attribute">ifconfig</span><br></code></pre></td></tr></table></figure>

<figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs css">ip <span class="hljs-selector-tag">address</span><br></code></pre></td></tr></table></figure>

<p><img src="http://blog.memory-life.xyz/image-20231004152429614.png" alt="image-20231004152429614"></p>
<p><img src="http://blog.memory-life.xyz/image-20231004152435529.png" alt="image-20231004152435529"></p>
<p><img src="http://blog.memory-life.xyz/image-20231004152707721.png" alt="image-20231004152707721"></p>
<figure class="highlight autoit"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs autoit"><span class="hljs-built_in">ping</span> www.baidu.com<br></code></pre></td></tr></table></figure>

<figure class="highlight apache"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs apache"><span class="hljs-attribute">ping</span> -c <span class="hljs-number">5</span> -s <span class="hljs-number">20</span> www.baidu.com		指定发送数据包数量、大小<br></code></pre></td></tr></table></figure>

<p><img src="http://blog.memory-life.xyz/image-20231004153027133.png" alt="image-20231004153027133"></p>
<figure class="highlight nginx"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs nginx"><span class="hljs-attribute">netstat</span>			查看端口占用情况<br></code></pre></td></tr></table></figure>

<figure class="highlight ebnf"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs ebnf"><span class="hljs-attribute">netstat -tulpn</span><br></code></pre></td></tr></table></figure>

<p><img src="http://blog.memory-life.xyz/image-20231004154307867.png" alt="image-20231004154307867"></p>
<figure class="highlight ebnf"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs ebnf"><span class="hljs-attribute">ss</span><br></code></pre></td></tr></table></figure>

<figure class="highlight ebnf"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs ebnf"><span class="hljs-attribute">ss -tulpn</span><br></code></pre></td></tr></table></figure>

<figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs css">sudo iptables -<span class="hljs-selector-tag">I</span> <span class="hljs-selector-tag">INPUT</span> -<span class="hljs-selector-tag">p</span> tcp -m tcp <span class="hljs-attr">--dport</span> <span class="hljs-number">80</span> -j ACCEPT		开放指定端口<br></code></pre></td></tr></table></figure>

<figure class="highlight apache"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs apache"><span class="hljs-attribute">sudo</span> ufw <span class="hljs-literal">allow</span> <span class="hljs-number">80</span>		sudo ufw status      sudo ufw enable<br></code></pre></td></tr></table></figure>

<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-built_in">uname</span>		查看系统信息<br></code></pre></td></tr></table></figure>

<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-built_in">uname</span> -a	系统详细信息<br></code></pre></td></tr></table></figure>

<p><img src="http://blog.memory-life.xyz/image-20231004154914080.png" alt="image-20231004154914080"></p>
<figure class="highlight nginx"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs nginx"><span class="hljs-attribute">neofetch</span>		需要安装<br></code></pre></td></tr></table></figure>

<figure class="highlight nginx"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs nginx"><span class="hljs-attribute">cal</span>		日历<br></code></pre></td></tr></table></figure>

<p><img src="http://blog.memory-life.xyz/image-20231004155130230.png" alt="image-20231004155130230"></p>
<figure class="highlight subunit"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs subunit">echo &quot;1<span class="hljs-string">+2</span><span class="hljs-string">+3</span><span class="hljs-string">+4</span><span class="hljs-string">+5</span>&quot; | bc		计算<br></code></pre></td></tr></table></figure>

<p><img src="http://blog.memory-life.xyz/image-20231004155223354.png" alt="image-20231004155223354"></p>
<figure class="highlight gams"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs gams"><span class="hljs-keyword">free</span>		内存空间占用情况<br></code></pre></td></tr></table></figure>

<p><img src="http://blog.memory-life.xyz/image-20231004155301145.png" alt="image-20231004155301145"></p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-built_in">df</span>		<span class="hljs-built_in">df</span> -H<br></code></pre></td></tr></table></figure>

<p><img src="http://blog.memory-life.xyz/image-20231004155406561.png" alt="image-20231004155406561"></p>
<figure class="highlight nginx"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs nginx"><span class="hljs-attribute">ps</span>		进程管理<br></code></pre></td></tr></table></figure>

<figure class="highlight dos"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs dos">ps -<span class="hljs-built_in">aux</span>		更详细的进程信息<br></code></pre></td></tr></table></figure>

<p><img src="http://blog.memory-life.xyz/image-20231004155505958.png" alt="image-20231004155505958"></p>
<p><img src="http://blog.memory-life.xyz/image-20231004155522343.png" alt="image-20231004155522343"></p>
<figure class="highlight coq"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs coq"><span class="hljs-built_in">top</span>			任务管理<br></code></pre></td></tr></table></figure>

<figure class="highlight nginx"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs nginx"><span class="hljs-attribute">htop</span> 	需安装<br></code></pre></td></tr></table></figure>

<p><img src="http://blog.memory-life.xyz/image-20231004155713184.png" alt="image-20231004155713184"></p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-built_in">kill</span> 		根据pid杀掉进程<br></code></pre></td></tr></table></figure>

<p><img src="http://blog.memory-life.xyz/image-20231004155927003.png" alt="image-20231004155927003"></p>
<figure class="highlight awk"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs awk">systemctl start <span class="hljs-regexp">/ stop /</span> status / enable<br></code></pre></td></tr></table></figure>

<p><img src="http://blog.memory-life.xyz/image-20231004160043296.png" alt="image-20231004160043296"></p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-built_in">history</span>		历史输入命令<br></code></pre></td></tr></table></figure>

<figure class="highlight arduino"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs arduino">sudo shutdown		sudo shutdown -h now		关机<br></code></pre></td></tr></table></figure>

<h2 id="命令"><a href="#命令" class="headerlink" title="命令"></a>命令</h2><h3 id="通用格式"><a href="#通用格式" class="headerlink" title="通用格式"></a>通用格式</h3><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs css">command <span class="hljs-selector-attr">[-options]</span> <span class="hljs-selector-attr">[parameter]</span><br></code></pre></td></tr></table></figure>

<figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs markdown">command : 命令本身<br>-options : 选项[可选]<br>parameter : 参数[可选]<br></code></pre></td></tr></table></figure>

<h3 id="目录操作命令"><a href="#目录操作命令" class="headerlink" title="目录操作命令"></a>目录操作命令</h3><ul>
<li><h5 id="ls-列出目录"><a href="#ls-列出目录" class="headerlink" title="ls - 列出目录"></a>ls - 列出目录</h5></li>
</ul>
<figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs sql">ls [<span class="hljs-operator">-</span>a <span class="hljs-operator">-</span>l <span class="hljs-operator">-</span>h] [Linux路径]<br></code></pre></td></tr></table></figure>

<figure class="highlight ada"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs ada">-a : 列出全部文件, 包含隐藏的文件/文件夹<br>-l : 纵向形式排列信息<br>-h : 列出文件大小, 与-<span class="hljs-type">l</span>配合使用<br></code></pre></td></tr></table></figure>

<ul>
<li><h5 id="cd-切换工作目录-Change-Directory"><a href="#cd-切换工作目录-Change-Directory" class="headerlink" title="cd - 切换工作目录 (Change Directory)"></a>cd - 切换工作目录 (Change Directory)</h5></li>
</ul>
<figure class="highlight apache"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs apache"><span class="hljs-attribute">cd</span><span class="hljs-meta"> [Linux路径]</span><br></code></pre></td></tr></table></figure>

<figure class="highlight awk"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs awk">cd   回到用户的HOME目录 <span class="hljs-regexp">/home/m</span>emory<br></code></pre></td></tr></table></figure>

<figure class="highlight awk"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs awk">cd <span class="hljs-regexp">/ 回到根目录 /</span><br></code></pre></td></tr></table></figure>

<figure class="highlight jboss-cli"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><code class="hljs jboss-cli">注:  / 表示根目录<br>	~/ 表示 <span class="hljs-string">/home/memory</span><br>    <span class="hljs-string">./</span> 表示当前目录<br>    <span class="hljs-string">../</span> 表示上一级目录<br></code></pre></td></tr></table></figure>

<ul>
<li><h5 id="pwd-查看当前工作目录-Print-Work-Directory"><a href="#pwd-查看当前工作目录-Print-Work-Directory" class="headerlink" title="pwd - 查看当前工作目录 (Print Work Directory)"></a>pwd - 查看当前工作目录 (Print Work Directory)</h5></li>
</ul>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-built_in">pwd</span> 无选项 无参数<br></code></pre></td></tr></table></figure>

<ul>
<li><h5 id="mkdir-创建目录-Make-Directory"><a href="#mkdir-创建目录-Make-Directory" class="headerlink" title="mkdir - 创建目录 (Make Directory)"></a>mkdir - 创建目录 (Make Directory)</h5></li>
</ul>
<figure class="highlight arduino"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs arduino">mkdir [-p] Linux路径<br></code></pre></td></tr></table></figure>

<figure class="highlight ada"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs ada">-p : 选填, 可创建多级目录<br>Linux路径 : 必填<br></code></pre></td></tr></table></figure>

<h3 id="文件操作命令"><a href="#文件操作命令" class="headerlink" title="文件操作命令"></a>文件操作命令</h3><ul>
<li><h5 id="touch-创建文件"><a href="#touch-创建文件" class="headerlink" title="touch - 创建文件"></a>touch - 创建文件</h5></li>
</ul>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-built_in">touch</span> Linux路径<br></code></pre></td></tr></table></figure>

<figure class="highlight"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs">无选项 参数必填<br></code></pre></td></tr></table></figure>

<ul>
<li><h5 id="cat-查看文件内容"><a href="#cat-查看文件内容" class="headerlink" title="cat - 查看文件内容"></a>cat - 查看文件内容</h5></li>
</ul>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-built_in">cat</span> Linux路径<br></code></pre></td></tr></table></figure>

<figure class="highlight"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs">无选项 参数必填<br></code></pre></td></tr></table></figure>

<ul>
<li><h5 id="more-查看文件内容-可翻页查看-空格翻页-q-退出"><a href="#more-查看文件内容-可翻页查看-空格翻页-q-退出" class="headerlink" title="more - 查看文件内容 (可翻页查看, 空格翻页, q 退出)"></a>more - 查看文件内容 (可翻页查看, 空格翻页, q 退出)</h5></li>
</ul>
<figure class="highlight dos"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs dos"><span class="hljs-built_in">more</span> Linux路径<br></code></pre></td></tr></table></figure>

<figure class="highlight"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs">无选项 参数必填<br></code></pre></td></tr></table></figure>

<ul>
<li><h5 id="cp-复制文件-文件夹-copy"><a href="#cp-复制文件-文件夹-copy" class="headerlink" title="cp - 复制文件/文件夹 (copy)"></a>cp - 复制文件/文件夹 (copy)</h5></li>
</ul>
<figure class="highlight avrasm"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs avrasm"><span class="hljs-keyword">cp</span> [-r] 参数一 参数二<br></code></pre></td></tr></table></figure>

<figure class="highlight ada"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs ada">-r : 可选, 复制文件夹时使用<br>参数一 : <span class="hljs-type">Linux</span>路径, 表示被复制的文件或文件夹<br>参数二 : <span class="hljs-type">Linux</span>路径, 表示要复制去的地方<br></code></pre></td></tr></table></figure>

<ul>
<li><h5 id="rm-删除文件-文件夹-remove"><a href="#rm-删除文件-文件夹-remove" class="headerlink" title="rm - 删除文件/文件夹 (remove)"></a>rm - 删除文件/文件夹 (remove)</h5></li>
</ul>
<figure class="highlight prolog"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs prolog">rm [-r -f] 参数一 参数二 ......<br></code></pre></td></tr></table></figure>

<figure class="highlight ada"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs ada">-r : 删除文件夹时使用<br>-f : 强制删除 (<span class="hljs-type">force</span>)<br>参数 : 要删除的文件/文件夹路径<br></code></pre></td></tr></table></figure>

<ul>
<li><h5 id="mv-移动文件-文件夹-move"><a href="#mv-移动文件-文件夹-move" class="headerlink" title="mv - 移动文件/文件夹 (move)"></a>mv - 移动文件/文件夹 (move)</h5></li>
</ul>
<figure class="highlight arduino"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs arduino">move 参数一 参数二<br></code></pre></td></tr></table></figure>

<figure class="highlight ada"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs ada">参数一 : <span class="hljs-type">Linux</span>路径, 表示被移动的文件或文件夹<br>参数二 : <span class="hljs-type">Linux</span>路径, 表示移动去的地方,<br></code></pre></td></tr></table></figure>

<h3 id="归档管理"><a href="#归档管理" class="headerlink" title="归档管理"></a>归档管理</h3><h4 id="tar-命令"><a href="#tar-命令" class="headerlink" title="tar 命令"></a>tar 命令</h4><ul>
<li><h5 id="gzip-格式压缩文件"><a href="#gzip-格式压缩文件" class="headerlink" title="gzip 格式压缩文件"></a>gzip 格式压缩文件</h5></li>
</ul>
<figure class="highlight awk"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs awk">tar -zcvf test.tar.gz <span class="hljs-regexp">/root/</span>test<br></code></pre></td></tr></table></figure>

<figure class="highlight diff"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><code class="hljs diff"><span class="hljs-deletion">-c: 创建文件</span><br><span class="hljs-deletion">-v: 显示执行过程</span><br><span class="hljs-deletion">-z: 用gzip压缩</span><br><span class="hljs-deletion">-f: 压缩的包名，必须放到所有选项后面</span><br></code></pre></td></tr></table></figure>

<ul>
<li><h5 id="查看压缩文件"><a href="#查看压缩文件" class="headerlink" title="查看压缩文件"></a>查看压缩文件</h5></li>
</ul>
<figure class="highlight cmake"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs cmake">tar -tf <span class="hljs-keyword">test</span>.tar.gz<br></code></pre></td></tr></table></figure>

<figure class="highlight diff"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs diff"><span class="hljs-deletion">-t: 显示归档文件中的文件列表，后面紧跟-f</span><br></code></pre></td></tr></table></figure>

<ul>
<li><h5 id="解压文件"><a href="#解压文件" class="headerlink" title="解压文件"></a>解压文件</h5></li>
</ul>
<figure class="highlight stylus"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs stylus">tar -xzvf test<span class="hljs-selector-class">.tar</span><span class="hljs-selector-class">.gz</span><br>tar -xzvf test<span class="hljs-selector-class">.tar</span><span class="hljs-selector-class">.gz</span> -C /home/<br></code></pre></td></tr></table></figure>

<figure class="highlight diff"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs diff"><span class="hljs-deletion">-x: 解压，不能与-c同时出现</span><br><span class="hljs-deletion">-C: 解压到指定目录</span><br></code></pre></td></tr></table></figure>

<ul>
<li><h5 id="排除不需要压缩的文件"><a href="#排除不需要压缩的文件" class="headerlink" title="排除不需要压缩的文件"></a>排除不需要压缩的文件</h5></li>
</ul>
<figure class="highlight cmake"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><code class="hljs cmake"><span class="hljs-comment"># 排除某个文件</span><br>tar -zcvf <span class="hljs-keyword">test</span>.tar.gz --exclude=<span class="hljs-keyword">test</span>.sh <span class="hljs-keyword">test</span><br><span class="hljs-comment"># 排除某个目录</span><br>tar -zcvf <span class="hljs-keyword">test</span>.tar.gz --exclude=bak <span class="hljs-keyword">test</span><br></code></pre></td></tr></table></figure>

<h4 id="zip-命令"><a href="#zip-命令" class="headerlink" title="zip 命令"></a>zip 命令</h4><ul>
<li><h5 id="压缩文件"><a href="#压缩文件" class="headerlink" title="压缩文件"></a>压缩文件</h5></li>
</ul>
<figure class="highlight stata"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs stata"><span class="hljs-keyword">zip</span> -r <span class="hljs-keyword">test</span>.<span class="hljs-keyword">zip</span> /root/<span class="hljs-keyword">test</span><br></code></pre></td></tr></table></figure>

<figure class="highlight diff"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs diff"><span class="hljs-deletion">-r: 递归处理，把目录和文件一起处理，显示压缩过程</span><br></code></pre></td></tr></table></figure>

<ul>
<li><h5 id="更新压缩包文件"><a href="#更新压缩包文件" class="headerlink" title="更新压缩包文件"></a>更新压缩包文件</h5></li>
</ul>
<figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs python"><span class="hljs-comment"># 从压缩包中删除指定文件，如果指定文件不存在，不做任何改动</span><br><span class="hljs-built_in">zip</span> -d test.<span class="hljs-built_in">zip</span> a.txt<br></code></pre></td></tr></table></figure>

<h4 id="unzip-命令"><a href="#unzip-命令" class="headerlink" title="unzip 命令"></a>unzip 命令</h4><ul>
<li><h5 id="查看压缩包内文件"><a href="#查看压缩包内文件" class="headerlink" title="查看压缩包内文件"></a>查看压缩包内文件</h5></li>
</ul>
<figure class="highlight stata"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs stata">unzip -<span class="hljs-keyword">l</span> <span class="hljs-keyword">test</span>.<span class="hljs-keyword">zip</span><br></code></pre></td></tr></table></figure>

<figure class="highlight diff"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs diff"><span class="hljs-deletion">-l: 可清晰地看到zip文件内的详细信息</span><br></code></pre></td></tr></table></figure>

<ul>
<li><h5 id="查看有无文件"><a href="#查看有无文件" class="headerlink" title="查看有无文件"></a>查看有无文件</h5></li>
</ul>
<figure class="highlight stata"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs stata">unzip -t <span class="hljs-keyword">test</span>.<span class="hljs-keyword">zip</span><br></code></pre></td></tr></table></figure>

<figure class="highlight diff"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs diff"><span class="hljs-deletion">-t: 显示OK则说明无损坏</span><br></code></pre></td></tr></table></figure>

<ul>
<li><h5 id="解压文件-1"><a href="#解压文件-1" class="headerlink" title="解压文件"></a>解压文件</h5></li>
</ul>
<figure class="highlight stata"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs stata">unzip <span class="hljs-keyword">test</span>.<span class="hljs-keyword">zip</span><br></code></pre></td></tr></table></figure>

<ul>
<li><h5 id="解压到特定目录"><a href="#解压到特定目录" class="headerlink" title="解压到特定目录"></a>解压到特定目录</h5></li>
</ul>
<figure class="highlight stata"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs stata">unzip <span class="hljs-keyword">test</span>.<span class="hljs-keyword">zip</span> -<span class="hljs-keyword">d</span> <span class="hljs-keyword">test</span><br>unzip -<span class="hljs-keyword">d</span> <span class="hljs-keyword">test</span> <span class="hljs-keyword">test</span>.<span class="hljs-keyword">zip</span><br></code></pre></td></tr></table></figure>

<h2 id="学习"><a href="#学习" class="headerlink" title="学习"></a>学习</h2><blockquote>
<p>2024 年 5 月 16 日</p>
</blockquote>
<p>最近学习操作系统：[11 高级技巧之日志分析：利用 Linux 指令分析 Web 日志 (lianglianglee.com)](<a target="_blank" rel="noopener" href="https://learn.lianglianglee.com/%E4%B8%93%E6%A0%8F/%E9%87%8D%E5%AD%A6%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F-%E5%AE%8C/11">https://learn.lianglianglee.com/专栏/重学操作系统-完/11</a> 高级技巧之日志分析：利用 Linux 指令分析 Web 日志.md)</p>
<p><img src="C:\Users\Lenovo\AppData\Roaming\Typora\typora-user-images\image-20240516113705582.png" alt="image-20240516113705582"></p>
<p>我在使用 yum 安装 htop，看看安装完成后的使用效果吧</p>
<p>执行以下命令，效果还不错：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">sudo yum install htop<br></code></pre></td></tr></table></figure>

<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">htop<br></code></pre></td></tr></table></figure>

<p><img src="http://blog.memory-life.xyz/image-20240516113918242.png" alt="image-20240516113918242"></p>
<h2 id="本机安装虚拟机"><a href="#本机安装虚拟机" class="headerlink" title="本机安装虚拟机"></a>本机安装虚拟机</h2><blockquote>
<p>2024 年 5 月 28 日</p>
</blockquote>
<h3 id="初始化"><a href="#初始化" class="headerlink" title="初始化"></a>初始化</h3><p>下载安装 VM Ware：</p>
<p>下载安装 Ubuntu 镜像：<a target="_blank" rel="noopener" href="http://releases.ubuntu.com/">Ubuntu Releases</a></p>
<p><img src="http://blog.memory-life.xyz/image-20240528100447611.png" alt="image-20240528100447611"></p>
<p>更改分辨率，下载语言包，更改时区等</p>
<p><img src="http://blog.memory-life.xyz/image-20240528103406006.png" alt="image-20240528103406006"></p>
<p>Ctrl + Alt + t，打开终端，使用 apt 包管理器尝试安装 Docker：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">lisudo apt install docker.io<br></code></pre></td></tr></table></figure>

<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">docker -v<br></code></pre></td></tr></table></figure>

<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">sudo docker run hello-world<br></code></pre></td></tr></table></figure>

<p><img src="http://blog.memory-life.xyz/image-20240528104339617.png" alt="image-20240528104339617"></p>
<h3 id="远程连接"><a href="#远程连接" class="headerlink" title="远程连接"></a>远程连接</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">ifconfig<br></code></pre></td></tr></table></figure>

<p>win + ip，也可以直接查看 IP 地址</p>
<p><img src="http://blog.memory-life.xyz/image-20240528104718587.png" alt="image-20240528104718587"></p>
<p>检查一下本机（windows 操作系统）能不能 ping 通 虚拟机：</p>
<p><img src="http://blog.memory-life.xyz/image-20240528104904570.png" alt="image-20240528104904570"></p>
<p>安装 ssh 远程连接服务：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">sudo apt-get install openssh-server<br></code></pre></td></tr></table></figure>

<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">ps -ef | grep ssh<br></code></pre></td></tr></table></figure>

<p><img src="http://blog.memory-life.xyz/image-20240528105309108.png" alt="image-20240528105309108"></p>
<p>当然，如果服务没有正常启动，启动就可以：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">sudo ssh run<br></code></pre></td></tr></table></figure>

<p>更新软件包：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">sudo apt update<br></code></pre></td></tr></table></figure>

<p>安装 Java 8 环境：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">sudo apt install openjdk-8-jdk<br></code></pre></td></tr></table></figure>

<p>查看是否安装成功：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">java -version<br></code></pre></td></tr></table></figure>

<p><img src="http://blog.memory-life.xyz/image-20240528105540192.png" alt="image-20240528105540192"></p>
<p>首先配置文件同步：</p>
<p><img src="http://blog.memory-life.xyz/image-20240529094857586.png" alt="image-20240529094857586"></p>
<p>输入指定连接的 Linux 服务器主机名、用户名和密码，成功连接。</p>
<p><img src="http://blog.memory-life.xyz/image-20240529100151507.png" alt="image-20240529100151507"></p>
<p>这样就能看到 linux 服务器上的目录了：</p>
<p><img src="http://blog.memory-life.xyz/image-20240529094857586.png"></p>
<p>没有这个右侧边栏，可以选择在菜单栏里找到并选择显示：</p>
<p><img src="http://blog.memory-life.xyz/image-20240529100552713.png" alt="image-20240529100552713"></p>
<p>远程连接配置完毕，我们需要实现把 window 上的文件，自动同步到 linux 虚拟机的文件目录中。</p>
<h3 id="文件同步"><a href="#文件同步" class="headerlink" title="文件同步"></a>文件同步</h3><p>指定要将本机的哪个目录下的文件，同步到 linux 的哪个目录下：</p>
<p><img src="http://blog.memory-life.xyz/image-20240529101215081.png" alt="image-20240529101215081"></p>
<p>同步部署文件到 linux 虚拟机上：</p>
<p><img src="http://blog.memory-life.xyz/image-20240529101522319.png" alt="image-20240529101522319"></p>
<p>这里会显示出未同步的文件，可以挨个检查同步，也可以一键同步所有文件：</p>
<p><img src="http://blog.memory-life.xyz/image-20240529101416092.png" alt="image-20240529101416092"></p>
<p>同步完成，查看下 linux 虚拟机中的文件：</p>
<p><img src="http://blog.memory-life.xyz/image-20240529101857983.png" alt="image-20240529101857983"></p>
<p>可以看到所有代码文件已经同步完成，还可以开启自动同步，无需手动操作：</p>
<p><img src="http://blog.memory-life.xyz/image-20240529101802814.png" alt="image-20240529101802814"></p>
<p>那我们在项目根路径下新建文件 hello.txt，填写文件内容后保存。</p>
<p><img src="http://blog.memory-life.xyz/image-20240529102128675.png" alt="image-20240529102128675"></p>
<p>直接就能在 linux 虚拟机中看到文件已经自动同步过来了：</p>
<p><img src="http://blog.memory-life.xyz/image-20240529102107829.png" alt="image-20240529102107829"></p>
<p>在 options 下还有很多可以修改的设置，比如删除本地文件是是否需要同步删除远程，而不用给提示：</p>
<p><img src="http://blog.memory-life.xyz/image-20240529102253345.png" alt="image-20240529102253345"></p>
<p><img src="http://blog.memory-life.xyz/image-20240529102312930.png" alt="image-20240529102312930"></p>
<h3 id="项目启动"><a href="#项目启动" class="headerlink" title="项目启动"></a>项目启动</h3><p>在 IDEA 中找到 linux 虚拟机对应终端窗口，直接输入命令，尝试在 linux 服务器中启动项目：</p>
<figure class="highlight stata"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs stata">mvn spring-<span class="hljs-keyword">boot</span>:<span class="hljs-keyword">run</span><br></code></pre></td></tr></table></figure>

<p><img src="http://blog.memory-life.xyz/image-20240529102807458.png" alt="image-20240529102807458"></p>
<p><img src="http://blog.memory-life.xyz/image-20240529102647088.png" alt="image-20240529102647088"></p>
<p>可以看到虚拟机内正在下载拉取依赖包，等待项目启动中……</p>
<p><img src="http://blog.memory-life.xyz/image-20240529102913875.png" alt="image-20240529102913875"></p>
<p><a target="_blank" rel="noopener" href="https://www.cnblogs.com/chenyablog/p/15392352.html">No plugin found for prefix spring-boot in the current project and in the plugin groups 异常解决 - 小旭的 blog - 博客园 (cnblogs.com)</a></p>
<p><img src="http://blog.memory-life.xyz/image-20240529103358169.png" alt="image-20240529103358169"></p>
<blockquote>
<p>2024 年 9 月 26 日</p>
</blockquote>
<p>哈哈哈，今天回过头来看到这戛然而止的教学莫名戳中笑点，尝试在 Linux 服务器下部署项目失败了吗。</p>
<p>当然会失败了，这全新的 Linux 服务器上环境都没有安装完成呢，起一个 Maven 构建的项目怎么可能。</p>
<p>这就是接下来需要学习的内容了，尝试在 Linux 环境下尝试部署并启动项目。</p>
<p><a target="_blank" rel="noopener" href="https://blog.csdn.net/Eternity_he/article/details/131720468">linux 系统部署 springboot 项目，过程详细！_linux 部署 springboot 项目-CSDN 博客</a></p>
<p><a target="_blank" rel="noopener" href="https://www.cnblogs.com/yangyubo/p/17832288.html">在 linux 上部署 SpringBoot 项目 - 几迟秋 - 博客园 (cnblogs.com)</a></p>
<h2 id="安装-Tomcat"><a href="#安装-Tomcat" class="headerlink" title="安装 Tomcat"></a>安装 Tomcat</h2><blockquote>
<p>2024 年 9 月 26 日</p>
</blockquote>
<p><a target="_blank" rel="noopener" href="https://blog.csdn.net/m0_52985087/article/details/135697613">Linux 环境下部署 Tomcat(详细图文)_linux 部署 tomcat-CSDN 博客</a></p>
<p><a target="_blank" rel="noopener" href="https://blog.csdn.net/Eternity_he/article/details/131720468">linux 系统部署 springboot 项目，过程详细！_linux 部署 springboot 项目-CSDN 博客</a></p>
<p><a target="_blank" rel="noopener" href="https://www.cnblogs.com/yangyubo/p/17832288.html">在 linux 上部署 SpringBoot 项目 - 几迟秋 - 博客园 (cnblogs.com)</a></p>
<hr>
<h1 id="部署项目到-linux"><a href="#部署项目到-linux" class="headerlink" title="部署项目到 linux"></a>部署项目到 linux</h1><blockquote>
<p>2024 年 9 月 26 日</p>
</blockquote>
<p>最近正好开启了 <strong>CodeForge 计划</strong>，想来把项目部署在 Linux 上也是 IT 人的必备技能了，借此机会熟络巩固一番。</p>
<p>今天早上看见了这篇博客，其实是前两天早已收藏浏览过的，博客园高质量博客。</p>
<p><strong>担心文章过段时间会找不到，这样的优质文章必须要在我的个人博客当中占据一席之地，赶快摘录保存下来。</strong></p>
<ul>
<li>软件安装</li>
<li>项目部署</li>
</ul>
<h2 id="1-软件安装"><a href="#1-软件安装" class="headerlink" title="1. 软件安装"></a>1. 软件安装</h2><h3 id="1-1-软件安装方式"><a href="#1-1-软件安装方式" class="headerlink" title="1.1 软件安装方式"></a>1.1 软件安装方式</h3><p>在 Linux 系统中，安装软件的方式主要有四种，这四种安装方式的特点如下：</p>
<table>
<thead>
<tr>
<th>安装方式</th>
<th>特点</th>
</tr>
</thead>
<tbody><tr>
<td>二进制发布包安装</td>
<td>软件已经针对具体平台编译打包发布，只要解压，修改配置即可</td>
</tr>
<tr>
<td>rpm 安装</td>
<td>软件已经按照 redhat 的包管理规范进行打包，使用 rpm 命令进行安装，不能自行解决库依赖问题</td>
</tr>
<tr>
<td>yum 安装</td>
<td>一种在线软件安装方式，本质上还是 rpm 安装，自动下载安装包并安装，安装过程中自动解决库依赖问题(安装过程需要联网)</td>
</tr>
<tr>
<td>源码编译安装</td>
<td>软件以源码工程的形式发布，需要自己编译打包</td>
</tr>
</tbody></table>
<h3 id="1-2-安装-JDK"><a href="#1-2-安装-JDK" class="headerlink" title="1.2 安装 JDK"></a>1.2 安装 JDK</h3><p>上述我们介绍了 Linux 系统软件安装的四种形式，接下来我们就通过第一种(二进制发布包)形式来安装 JDK。</p>
<p>JDK 具体安装步骤如下：</p>
<p><strong>1). 上传安装包</strong></p>
<p>使用 FinalShell 自带的上传工具将 jdk 的二进制发布包上传到 Linux</p>
<p><img src="https://img2023.cnblogs.com/blog/3320065/202311/3320065-20231114184406608-1156802036.png" alt="img"></p>
<p>由于上述在进行文件上传时，选择的上传目录为根目录 /，上传完毕后，我们执行指令 cd / 切换到根目录下，查看上传的安装包。</p>
<p><img src="https://img2023.cnblogs.com/blog/3320065/202311/3320065-20231114191939970-240970142.png" alt="img"></p>
<p><strong>2). 解压安装包</strong></p>
<p>执行如下指令，将上传上来的压缩包进行解压，并通过-C 参数指定解压文件存放目录为 /usr/local。</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">tar -zxvf jdk-8u171-linux-x64.tar.gz -C /usr/local<br></code></pre></td></tr></table></figure>

<p><img src="https://img2023.cnblogs.com/blog/3320065/202311/3320065-20231114192209205-1727030341.png" alt="img"></p>
<p><strong>3). 配置环境变量</strong></p>
<p>使用 vim 命令修改/etc/profile 文件，在文件末尾加入如下配置</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-built_in">export</span> JAVA_HOME=/usr/local/jdk1.8.0_171<br><span class="hljs-built_in">export</span> PATH=<span class="hljs-variable">$PATH</span>:<span class="hljs-variable">$JAVA_HOME</span>/bin<br></code></pre></td></tr></table></figure>

<p>具体操作指令如下:</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><code class="hljs bash">1). 编辑/etc/profile文件，进入命令模式<br>	vim /etc/profile<br><br>2). 在命令模式中，输入指令 G ， 切换到文件最后<br>	G<br><br>3). 在命令模式中输入 i/a/o 进入插入模式，然后切换到文件最后一行<br>	i<br><br>4). 将上述的配置拷贝到文件中<br>	<span class="hljs-built_in">export</span> JAVA_HOME=/usr/local/jdk1.8.0_171<br>	<span class="hljs-built_in">export</span> PATH=<span class="hljs-variable">$PATH</span>:<span class="hljs-variable">$JAVA_HOME</span>/bin<br><br>5). 从插入模式，切换到指令模式<br>	ESC<br><br>6). 按:进入底行模式，然后输入wq，回车保存<br>	:wq<br></code></pre></td></tr></table></figure>

<p><strong>4). 重新加载 profile 文件</strong></p>
<p>为了使更改的配置立即生效，需要重新加载 profile 文件，执行命令:</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-built_in">source</span> /etc/profile<br></code></pre></td></tr></table></figure>

<p><strong>5). 检查安装是否成功</strong></p>
<figure class="highlight mipsasm"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs mipsasm"><span class="hljs-keyword">java </span>-version<br></code></pre></td></tr></table></figure>

<p><img src="https://img2023.cnblogs.com/blog/3320065/202311/3320065-20231114192241033-1638808187.png" alt="img"></p>
<h3 id="1-3-安装-Tomcat"><a href="#1-3-安装-Tomcat" class="headerlink" title="1.3 安装 Tomcat"></a>1.3 安装 Tomcat</h3><h4 id="1-3-1-Tomcat-安装"><a href="#1-3-1-Tomcat-安装" class="headerlink" title="1.3.1 Tomcat 安装"></a>1.3.1 Tomcat 安装</h4><p>Tomcat 的安装和上述 JDK 的安装采用相同的方式，都是使用二进制发布包的形式进行安装</p>
<p>具体安装步骤如下：</p>
<p><strong>1). 上传安装包</strong></p>
<p>使用 FinalShell 自带的上传工具将 Tomcat 的二进制发布包上传到 Linux(与前面上传 JDK 安装包步骤一致)。</p>
<p><img src="https://img2023.cnblogs.com/blog/3320065/202311/3320065-20231114192302328-300689816.png" alt="img"></p>
<p><strong>2). 解压安装包</strong></p>
<p>将上传上来的安装包解压到指定目录/usr/local 下，执行命令为</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">tar -zxvf apache-tomcat-7.0.57.tar.gz -C /usr/local<br></code></pre></td></tr></table></figure>

<p><strong>3). 启动 Tomcat</strong></p>
<p>进入 Tomcat 的 bin 目录启动服务。执行命令为:</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-built_in">cd</span> /usr/local/apache-tomcat-7.0.57/<br><br><span class="hljs-built_in">cd</span> bin<br><br>sh startup.sh或者./startup.sh<br></code></pre></td></tr></table></figure>

<p><img src="https://img2023.cnblogs.com/blog/3320065/202311/3320065-20231114192346069-823293177.png" alt="img"><br><img src="https://img2023.cnblogs.com/blog/3320065/202311/3320065-20231114192359162-526677866.png" alt="img"></p>
<h4 id="1-3-2-Tomcat-进程查看"><a href="#1-3-2-Tomcat-进程查看" class="headerlink" title="1.3.2 Tomcat 进程查看"></a>1.3.2 Tomcat 进程查看</h4><p>上述我们将 Tomcat 启动完成之后，并不能知道 Tomcat 是否正常运行，那么我们验证 Tomcat 启动是否成功，有多种方式，我们这里主要介绍常见的两种方式：</p>
<p><strong>1). 查看启动日志</strong></p>
<p>Tomcat 的启动日志输出在 Tomcat 的安装目录下的 logs 目录中，Tomcat 的启动及运行日志文件名为 catalina.out，所以我们查看 Tomcat 启动日志，主要可以通过两条指令，如下：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><code class="hljs bash">1). 分页查询Tomcat的日志信息<br>more /usr/local/apache-tomcat-7.0.57/logs/catalina.out<br><br>2). 查询日志文件尾部的50行记录<br><span class="hljs-built_in">tail</span> -50 /usr/local/apache-tomcat-7.0.57/logs/catalina.out<br></code></pre></td></tr></table></figure>

<p>只要 Tomcat 在启动的过程中，日志输出没有报错，基本可以判定 Tomcat 启动成功了。</p>
<p><strong>2). 查询系统进程</strong></p>
<p>我们也可以通过 Linux 系统的查看系统进程的指令，来判定 Tomcat 进程是否存在，从而判定 Tomcat 是否启动。执行如下指令：</p>
<figure class="highlight perl"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs perl">ps -ef|<span class="hljs-keyword">grep</span> tomcat<br></code></pre></td></tr></table></figure>

<p><img src="https://img2023.cnblogs.com/blog/3320065/202311/3320065-20231114192439689-1187315625.png" alt="img"></p>
<p><strong>说明:</strong></p>
<ul>
<li>ps 命令是 linux 下非常强大的进程查看命令，通过 ps -ef 可以查看当前运行的所有进程的详细信息</li>
<li>“|” 在 Linux 中称为管道符，可以将前一个命令的结果输出给后一个命令作为输入</li>
<li>使用 ps 命令查看进程时，经常配合管道符和查找命令 grep 一起使用，来查看特定进程</li>
</ul>
<h4 id="1-3-3-防火墙操作"><a href="#1-3-3-防火墙操作" class="headerlink" title="1.3.3 防火墙操作"></a>1.3.3 防火墙操作</h4><p>前面我们已经通过日志的方式及查看系统进程的方式，验证了 Tomcat 服务已经正常启动，接下来我们就可以尝试访问一下。访问地址：<a target="_blank" rel="noopener" href="http://192.168.138.130:8080/">http://192.168.138.130:8080</a>，我们发现是访问不到的。</p>
<p><img src="https://img2023.cnblogs.com/blog/3320065/202311/3320065-20231114192456474-1732818562.png" alt="img"></p>
<p>那为什么 tomcat 启动成功了，但就是访问不到呢？原因就在于 Linux 系统的防火墙，系统安装完毕后，系统启动时，防火墙自动启动，防火墙拦截了所有端口的访问。接下来我们就需要学习一下，如何操作防火墙，具体指令如下：</p>
<table>
<thead>
<tr>
<th>操作</th>
<th>指令</th>
<th>备注</th>
</tr>
</thead>
<tbody><tr>
<td>查看防火墙状态</td>
<td>systemctl status firewalld / firewall-cmd –state</td>
<td></td>
</tr>
<tr>
<td>暂时关闭防火墙</td>
<td>systemctl stop firewalld</td>
<td></td>
</tr>
<tr>
<td>永久关闭防火墙(禁用开机自启)</td>
<td>systemctl disable firewalld</td>
<td>下次启动,才生效</td>
</tr>
<tr>
<td>暂时开启防火墙</td>
<td>systemctl start firewalld</td>
<td></td>
</tr>
<tr>
<td>永久开启防火墙(启用开机自启)</td>
<td>systemctl enable firewalld</td>
<td>下次启动,才生效</td>
</tr>
<tr>
<td>开放指定端口</td>
<td>firewall-cmd –zone=public –add-port=8080/tcp –permanent</td>
<td>需要重新加载生效</td>
</tr>
<tr>
<td>关闭指定端口</td>
<td>firewall-cmd –zone=public –remove-port=8080/tcp –permanent</td>
<td>需要重新加载生效</td>
</tr>
<tr>
<td>立即生效(重新加载)</td>
<td>firewall-cmd –reload</td>
<td></td>
</tr>
<tr>
<td>查看开放端口</td>
<td>firewall-cmd –zone=public –list-ports</td>
<td></td>
</tr>
</tbody></table>
<blockquote>
<p>注意：</p>
<p>A. systemctl 是管理 Linux 中服务的命令，可以对服务进行启动、停止、重启、查看状态等操作</p>
<p>B. firewall-cmd 是 Linux 中专门用于控制防火墙的命令</p>
<p>C. 为了保证系统安全，服务器的防火墙不建议关闭</p>
</blockquote>
<p>那么我们要想访问到 Tomcat，就可以采取两种类型的操作：</p>
<p><strong>A. 关闭防火墙</strong></p>
<p>执行指令 :</p>
<figure class="highlight vbnet"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs vbnet">systemctl <span class="hljs-keyword">stop</span> firewalld<br></code></pre></td></tr></table></figure>

<p>关闭之后，再次访问 Tomcat，就可以访问到了。</p>
<p><img src="https://img2023.cnblogs.com/blog/3320065/202311/3320065-20231114192515847-1500710488.png" alt="img"></p>
<p>注意: 上面我们也提到了，直接关闭系统的防火墙，是不建议的，因为这样会造成系统不安全。</p>
<p><strong>B. 开放 Tomcat 的端口号 8080</strong></p>
<p>执行指令:</p>
<figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><code class="hljs sql">①. 先开启系统防火墙<br>systemctl <span class="hljs-keyword">start</span> firewalld<br><br>②. 再开放<span class="hljs-number">8080</span>端口号<br>firewall<span class="hljs-operator">-</span>cmd <span class="hljs-comment">--zone=public --add-port=8080/tcp --permanent</span><br><br>③. 重新加载防火墙<br>firewall<span class="hljs-operator">-</span>cmd <span class="hljs-comment">--reload</span><br></code></pre></td></tr></table></figure>

<p>执行上述的操作之后，就开放了当前系统中的 8080 端口号，再次访问 Tomcat。</p>
<p><img src="https://img2023.cnblogs.com/blog/3320065/202311/3320065-20231114192540900-2132164653.png" alt="img"></p>
<h4 id="1-3-4-停止-Tomcat"><a href="#1-3-4-停止-Tomcat" class="headerlink" title="1.3.4 停止 Tomcat"></a>1.3.4 停止 Tomcat</h4><p>在 Linux 系统中，停止 Tomcat 服务的方式主要有两种：</p>
<p><strong>1). 运行 Tomcat 提供的脚本文件</strong></p>
<p>在 Tomcat 安装目录下有一个 bin 目录，这个目录中存放的是 tomcat 的运行脚本文件，其中有一个脚本就是用于停止 tomcat 服务的。</p>
<p><img src="https://img2023.cnblogs.com/blog/3320065/202311/3320065-20231114192558345-654365735.png" alt="img"></p>
<p>我们可以切换到 bin 目录，并执行如下指令，来停止 Tomcat 服务：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs bash">sh shutdown.sh<br>./shutdown.sh<br></code></pre></td></tr></table></figure>

<p><strong>2). 结束 Tomcat 进程</strong></p>
<p>我们可以先通过 <code>ps -ef|grep tomcat</code> 指令查看 tomcat 进程的信息，从进程信息中获取 tomcat 服务的进程号。然后通过 kill -9 的形式，来杀死系统进程。</p>
<p><img src="https://img2023.cnblogs.com/blog/3320065/202311/3320065-20231114192620870-804871921.png" alt="img"></p>
<p>通过上述的指令，我们可以获取到 tomcat 的进程号为 79947。接下来，我们就可以通过指令 ，来杀死 tomcat 的进程 ：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-built_in">kill</span> -9 79947<br></code></pre></td></tr></table></figure>

<p>执行完上述指令之后，我们再访问 Linux 系统中的 Tomcat，就访问不到了。</p>
<blockquote>
<p>注意：</p>
<p>kill 命令是 Linux 提供的用于结束进程的命令，-9 表示强制结束</p>
</blockquote>
<blockquote>
<p>注意 ：</p>
<p>虽然上述讲解的两种方式，都可以停止 Tomcat 服务，但是推荐使用第一种方式(./shutdown.sh)执行脚本来关闭 tomcat 服务，如果通过第一种方式停止不了 tomcat 了，这个时候，我们可以考虑使用第二种方式，强制杀死进程。</p>
</blockquote>
<h3 id="1-4-安装-MySQL"><a href="#1-4-安装-MySQL" class="headerlink" title="1.4 安装 MySQL"></a>1.4 安装 MySQL</h3><h4 id="1-4-1-MySQL-安装"><a href="#1-4-1-MySQL-安装" class="headerlink" title="1.4.1 MySQL 安装"></a>1.4.1 MySQL 安装</h4><p>对于 MySQL 数据库的安装，我们将要使用前面讲解的第二种安装方式 rpm 进行安装。那么首先我们先了解一下什么 rpm？</p>
<blockquote>
<p><strong>RPM：</strong>全称为 Red-Hat Package Manager，RPM 软件包管理器，是红帽 Linux 用于管理和安装软件的工具。</p>
</blockquote>
<p>我们要通过 rpm，进行 MySQL 数据库的安装，主要的步骤如下：</p>
<p><strong>1). 检测当前系统是否安装过 MySQL 相关数据库</strong></p>
<p>需要通过 rpm 相关指令，来查询当前系统中是否存在已安装的 mysql 软件包，执行指令如下：</p>
<figure class="highlight perl"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs perl">rpm -qa							查询当前系统中安装的所有软件<br>rpm -qa | <span class="hljs-keyword">grep</span> mysql			查询当前系统中安装的名称带mysql的软件<br>rpm -qa | <span class="hljs-keyword">grep</span> mariadb			查询当前系统中安装的名称带mariadb的软件<br></code></pre></td></tr></table></figure>

<p>通过 rpm -qa 查询到系统通过 rpm 安装的所有软件，太多了，不方便查看，所以我们可以通过管道符 | 配合着 grep 进行过滤查询。</p>
<p><img src="https://img2023.cnblogs.com/blog/3320065/202311/3320065-20231114192644812-1266324703.png" alt="img"></p>
<p>通过查询，我们发现在当前系统中存在 mariadb 数据库，是 CentOS7 中自带的，而这个数据库和 MySQL 数据库是冲突的，所以要想保证 MySQL 成功安装，需要卸载 mariadb 数据库。</p>
<p><strong>2). 卸载现有的 MySQL 数据库</strong></p>
<p>在 rpm 中，卸载软件的语法为：</p>
<figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs css">rpm -e <span class="hljs-attr">--nodeps</span>  软件名称<br></code></pre></td></tr></table></figure>

<p>那么，我们就可以通过指令，卸载 mariadb，具体指令为：</p>
<figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs css">rpm -e <span class="hljs-attr">--nodeps</span>  mariadb-libs-<span class="hljs-number">5.5</span>.<span class="hljs-number">60</span>-<span class="hljs-number">1</span><span class="hljs-selector-class">.el7_5</span><span class="hljs-selector-class">.x86_64</span><br></code></pre></td></tr></table></figure>

<p><img src="https://img2023.cnblogs.com/blog/3320065/202311/3320065-20231114192725649-1704846804.png" alt="img"></p>
<p>我们看到执行完毕之后， 再次查询 mariadb，就查不到了，因为已经被成功卸载了。</p>
<p><strong>3). 将资料中提供的 MySQL 安装包上传到 Linux 并解压</strong></p>
<p>A. 上传 MySQL 安装包</p>
<p><img src="https://img2023.cnblogs.com/blog/3320065/202311/3320065-20231114192750638-1177408460.png" alt="img"></p>
<p>B. 解压到/usr/local/mysql</p>
<p>执行如下指令:</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-built_in">mkdir</span> /usr/local/mysql<br>tar -zxvf mysql-5.7.25-1.el7.x86_64.rpm-bundle.tar.gz -C /usr/local/mysql<br></code></pre></td></tr></table></figure>

<p><img src="https://img2023.cnblogs.com/blog/3320065/202311/3320065-20231114192811495-640204680.png" alt="img"></p>
<p><strong>4). 安装顺序安装 rpm 安装包</strong></p>
<figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><code class="hljs shell">rpm -ivh mysql-community-common-5.7.25-1.el7.x86_64.rpm<br>rpm -ivh mysql-community-libs-5.7.25-1.el7.x86_64.rpm<br>rpm -ivh mysql-community-devel-5.7.25-1.el7.x86_64.rpm<br>rpm -ivh mysql-community-libs-compat-5.7.25-1.el7.x86_64.rpm<br>rpm -ivh mysql-community-client-5.7.25-1.el7.x86_64.rpm<br>yum install net-tools<br>rpm -ivh mysql-community-server-5.7.25-1.el7.x86_64.rpm<br></code></pre></td></tr></table></figure>

<blockquote>
<p>说明:</p>
<ul>
<li>因为 rpm 安装方式，是不会自动处理依赖关系的，需要我们自己处理，所以对于上面的 rpm 包的安装顺序不能随意修改。</li>
<li>安装过程中提示缺少 net-tools 依赖，使用 yum 安装(yum 是一种在线安装方式，需要保证联网)</li>
<li>可以通过指令(yum update)升级现有软件及系统内核</li>
</ul>
</blockquote>
<p><img src="https://img2023.cnblogs.com/blog/3320065/202311/3320065-20231114193759556-1363676129.png" alt="img"></p>
<h4 id="1-4-2-MySQL-启动"><a href="#1-4-2-MySQL-启动" class="headerlink" title="1.4.2 MySQL 启动"></a>1.4.2 MySQL 启动</h4><p>MySQL 安装完成之后，会自动注册为系统的服务，服务名为 mysqld。那么，我们就可以通过 systemctl 指令来查看 mysql 的状态、启动 mysql、停止 mysql。</p>
<figure class="highlight lua"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs lua">systemctl <span class="hljs-built_in">status</span> mysqld		查看mysql服务状态<br>systemctl start mysqld		启动mysql服务<br>systemctl stop mysqld		停止mysql服务<br></code></pre></td></tr></table></figure>

<p><img src="https://img2023.cnblogs.com/blog/3320065/202311/3320065-20231114193746861-91656126.png" alt="img"></p>
<blockquote>
<p>说明：</p>
<p>可以设置开机时启动 mysql 服务，避免每次开机启动 mysql。执行如下指令：</p>
<p>systemctl enable mysqld</p>
</blockquote>
<p>我们可以通过如下两种方式，来判定 mysql 是否启动：</p>
<figure class="highlight perl"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><code class="hljs perl">netstat -tunlp					查看已经启动的服务<br>netstat -tunlp | <span class="hljs-keyword">grep</span> mysql		查看mysql的服务信息<br><br>ps –ef | <span class="hljs-keyword">grep</span> mysql				查看mysql进程<br></code></pre></td></tr></table></figure>

<p><img src="https://img2023.cnblogs.com/blog/3320065/202311/3320065-20231114193828413-1711393458.png" alt="img"></p>
<blockquote>
<p>备注:</p>
<p>A. netstat 命令用来打印 Linux 中网络系统的状态信息，可让你得知整个 Linux 系统的网络情况。</p>
<p>参数说明:</p>
<p>-l 或–listening：显示监控中的服务器的 Socket；<br>​ -n 或–numeric：直接使用 ip 地址，而不通过域名服务器；<br>​ -p 或–programs：显示正在使用 Socket 的程序识别码和程序名称；<br>​ -t 或–tcp：显示 TCP 传输协议的连线状况；<br>​ -u 或–udp：显示 UDP 传输协议的连线状况；</p>
<p>B. ps 命令用于查看 Linux 中的进程数据。</p>
</blockquote>
<h4 id="1-4-3-MySQL-登录"><a href="#1-4-3-MySQL-登录" class="headerlink" title="1.4.3 MySQL 登录"></a>1.4.3 MySQL 登录</h4><h5 id="1-4-3-1-查阅临时密码"><a href="#1-4-3-1-查阅临时密码" class="headerlink" title="1.4.3.1 查阅临时密码"></a>1.4.3.1 查阅临时密码</h5><p>MySQL 启动起来之后，我们就可以测试一下登录操作，但是我们要想登录 MySQL，需要一个访问密码，而刚才在安装 MySQL 的过程中，并没有看到让我们设置访问密码，那这个访问密码是多少呢? 那实际上，对于 rpm 安装的 mysql，在 mysql 第一次启动时，会自动帮我们生成 root 用户的访问密码，并且输出在 mysql 的日志文件 /var/log/mysqld.log 中，我们可以查看这份日志文件，从而获取到访问密码。</p>
<p>可以执行如下指令：</p>
<p>1). cat /var/log/mysqld.log</p>
<p><img src="https://img2023.cnblogs.com/blog/3320065/202311/3320065-20231114193848334-1956911196.png" alt="img"></p>
<p>这种方式，可以看到所有的日志数据，文件比较大时，很不方便查看数据。我们可以通过管道符 | 配合 grep 来对数据进行过滤。</p>
<p>2). cat /var/log/mysqld.log | grep password</p>
<p>我们可以通过上述指令，查询日志文件内容中包含 password 的行信息。</p>
<p><img src="https://img2023.cnblogs.com/blog/3320065/202311/3320065-20231114193907298-1530752256.png" alt="img"></p>
<h5 id="1-4-3-2-登录-MySQL"><a href="#1-4-3-2-登录-MySQL" class="headerlink" title="1.4.3.2 登录 MySQL"></a>1.4.3.2 登录 MySQL</h5><p>获取到 root 用户的临时密码之后，我们就可以登录 mysql 数据库，修改 root 的密码，为 root 设置一个新的密码。并且我们还需要开启 root 用户远程访问该数据库的权限，这样的话，我们就可以在 windows 上来访问这台 MySQL 数据库。</p>
<p>执行如下指令：</p>
<figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><code class="hljs csharp">①. 登录mysql（复制日志中的临时密码登录）<br>	mysql -uroot -p<br><br>②. 修改密码<br>    <span class="hljs-keyword">set</span> <span class="hljs-keyword">global</span> validate_password_length=<span class="hljs-number">4</span>;			设置密码长度最低位数<br>    <span class="hljs-keyword">set</span> <span class="hljs-keyword">global</span> validate_password_policy=LOW;		设置密码安全等级低，便于密码可以修改成root<br>    <span class="hljs-keyword">set</span> password = password(<span class="hljs-string">&#x27;root&#x27;</span>);				设置密码为root<br><br>③. 开启访问权限<br>    grant all <span class="hljs-keyword">on</span> *.* to <span class="hljs-string">&#x27;root&#x27;</span>@<span class="hljs-string">&#x27;%&#x27;</span> identified <span class="hljs-keyword">by</span> <span class="hljs-string">&#x27;root&#x27;</span>;<br>    flush privileges;<br>   ssl协议问题<br>	vim /etc/my.cnf<br>	ssl-cipher=TLSv1<span class="hljs-number">.2</span><br></code></pre></td></tr></table></figure>

<p>操作完上述的指令之后，数据库 root 用户的密码以及远程访问我们就配置好了，接下来，可以执行 exit 退出 mysql，再次通过新的密码进行登录。</p>
<p><img src="https://img2023.cnblogs.com/blog/3320065/202311/3320065-20231114193929147-1213953876.png" alt="img"></p>
<p>当然我们也可以使用安装在 windows 系统中的 sqlyog 或者 Navicat 来远程连接 linux 上的 MySQL。</p>
<p><img src="https://img2023.cnblogs.com/blog/3320065/202311/3320065-20231114193949576-1197950064.png" alt="img"></p>
<p>注意： 要想在 windows 上能够访问 MySQL，还需要开放防火墙的 3306 端口，执行如下指令：</p>
<figure class="highlight dockerfile"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs dockerfile">firewall-<span class="hljs-keyword">cmd</span><span class="language-bash"> --zone=public --add-port=3306/tcp --permanent</span><br>firewall-<span class="hljs-keyword">cmd</span><span class="language-bash"> --reload</span><br></code></pre></td></tr></table></figure>

<p><img src="https://img2023.cnblogs.com/blog/3320065/202311/3320065-20231114194010057-1798472660.png" alt="img"></p>
<h3 id="1-5-安装-lrzsz"><a href="#1-5-安装-lrzsz" class="headerlink" title="1.5 安装 lrzsz"></a>1.5 安装 lrzsz</h3><p>lrzsz 是用于在 Linux 系统中文件上传下载的软件。大家可能会存在疑问，我们用 finalShell 图形化界面就可以很方便的完成上传下载，为什么还要使用这个软件来完成上传下载呢？实际上是这样的，Linux 的远程连接工具有很多，而 finalShell 只是其中的一种，而还有很多的远程连接工具并没有上传下载的功能，这个时候就需要依赖于 lrzsz 这个软件了。</p>
<p>对于 lrzsz 的安装，我们需要通过第三种软件安装方式 yum 来进行安装。这里，我们先对 yum 做一个简单介绍。</p>
<blockquote>
<p><strong>Yum：</strong> (Yellow dog Updater,Modified)，是一个在 Fedora 和 RedHat 以及 CentOS 中的 Shell 前端软件包管理器。基于 RPM 包管理，能够从指定的服务器自动下载 RPM 包并且安装，可以自动处理依赖关系，并且一次安装所有依赖的软件包，无须繁琐地一次次下载、安装。</p>
</blockquote>
<p>安装 lrzsz 的步骤如下:</p>
<p><strong>1). 搜索 lrzsz 安装包</strong></p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs undefined">yum list lrzsz<br></code></pre></td></tr></table></figure>

<p><img src="https://img2023.cnblogs.com/blog/3320065/202311/3320065-20231114194043392-1709286672.png" alt="img"></p>
<p><strong>2). 在线安装 lrzsz</strong></p>
<figure class="highlight mipsasm"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs mipsasm">yum <span class="hljs-keyword">install </span>lrzsz.x86_64<br></code></pre></td></tr></table></figure>

<p><img src="https://img2023.cnblogs.com/blog/3320065/202311/3320065-20231114194057541-1088361069.png" alt="img"></p>
<p><strong>3). 测试</strong></p>
<p>在命令行中输入 rz , 就会自动打开一个文件选择的窗口，然后选择要上传的文件。</p>
<p><img src="https://img2023.cnblogs.com/blog/3320065/202311/3320065-20231114194111278-251297722.png" alt="img"></p>
<blockquote>
<p><strong>yum 拓展知识:</strong></p>
<p>1). 如果在不更改软件来源的情况下，是需要联网才能使用 yum 的，那么我们安装的软件是从哪儿下载的呢，这里就涉及到一个概念： yum 源。</p>
<p>2). 我们可以通过一个指令，来检查当前的 yum 源</p>
<p><img src="https://img2023.cnblogs.com/blog/3320065/202311/3320065-20231114194131649-1823417741.png" alt="img"></p>
</blockquote>
<blockquote>
<p>从图中，我们可以看到我们安装的 CentOS7 采用的是网易的 163yum 源。</p>
<p>3). 网络 yum 源配置文件位于 /etc/yum.repos.d/ 目录下，文件扩展名为”*.repo”</p>
<p><img src="https://img2023.cnblogs.com/blog/3320065/202311/3320065-20231114194151187-252648266.png" alt="img"></p>
</blockquote>
<blockquote>
<p>可以看到，该目录下有 7 个 yum 配置文件，通常情况下 CentOS-Base.repo 文件生效。</p>
<p>4). 添加阿里云 yum 源</p>
<p>A. 先通过 <code>yum install wget</code> ,安装 wget 命令</p>
<p>B. 备份默认的网易 163 的 yum 源，执行指令 ：</p>
<p>切换目录: cd /etc/yum.repos.d/</p>
<p>创建备份目录: mkdir bak</p>
<p>移动现有的 yum 源文件到 bak: mv *.repo bak/</p>
<p>C. 下载阿里云的 yum 源</p>
<p>wget -O /etc/yum.repos.d/CentOS-Base.repo <a target="_blank" rel="noopener" href="http://mirrors.aliyun.com/repo/Centos-7.repo">http://mirrors.aliyun.com/repo/Centos-7.repo</a></p>
<p>D. 执行命令，重新生成 cache</p>
<p>yum clean all</p>
<p>yum makecache</p>
<p>E. 再次查看 yum 源</p>
<p><img src="https://img2023.cnblogs.com/blog/3320065/202311/3320065-20231114194220470-661443883.png" alt="img"></p>
</blockquote>
<blockquote>
<p>之后，我们通过 yum 指令安装软件，就是从阿里云下载的。</p>
</blockquote>
<h3 id="1-6-下载-Redis"><a href="#1-6-下载-Redis" class="headerlink" title="1.6 下载 Redis"></a>1.6 下载 Redis</h3><p><strong>方式一：</strong><br>找到 redis 官网（<a target="_blank" rel="noopener" href="https://redis.io/download%EF%BC%89">https://redis.io/download）</a></p>
<p><img src="https://img2023.cnblogs.com/blog/3320065/202311/3320065-20231114194437767-989254434.png" alt="img"></p>
<p>如果不想下载最新稳定版本而是想要下载指定的版本 （<a target="_blank" rel="noopener" href="https://download.redis.io/releases/%EF%BC%89">https://download.redis.io/releases/）</a></p>
<p><img src="https://img-blog.csdnimg.cn/400b5cbcfc6449f2bb3f845b5daaa979.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAcXFjb21pbmc=,size_20,color_FFFFFF,t_70,g_se,x_16" alt="在这里插入图片描述"></p>
<p>然后直接下载，进行上传到对应的目录即可</p>
<p><strong>方式二：（推荐）</strong><br>选着自己需要下载的版本后，右击选择复制链接，然后利用命令进行下载，输入 wget 将复制的链接粘帖上<br>命令如下：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">wget https://download.redis.io/releases/redis-6.0.5.tar.gz<br></code></pre></td></tr></table></figure>

<p>在控制台执行如下命令后：</p>
<p><img src="https://img-blog.csdnimg.cn/7478cd4ab27b4a6d95db89090c1b749c.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAcXFjb21pbmc=,size_20,color_FFFFFF,t_70,g_se,x_16" alt="在这里插入图片描述"></p>
<p><strong>解压安装 Redis</strong><br><strong>解压</strong><br>将下载的 redis 压缩包解压到指定的目录，一般是将 redis 目录放在 usr/local/redis 目录下，可以使用-C 指定到解压下目录</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">tar -zvxf redis-6.0.5.tar.gz -C /usr/local/redis<br></code></pre></td></tr></table></figure>

<p>解压后当前的目录出现一个 redis-6.0.5 的目录，就是我们刚刚解压的目录</p>
<p><img src="https://img-blog.csdnimg.cn/4996367c625043bc97630a9652cc5513.png" alt="在这里插入图片描述"></p>
<p><strong>编译</strong><br>由于 redis 是 c 语言编写的，所以我们需要先安装 gcc，安装的命令如下：</p>
<figure class="highlight r"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs r">yum install <span class="hljs-operator">-</span>y gcc<span class="hljs-operator">-</span><span class="hljs-built_in">c</span><span class="hljs-operator">+</span><span class="hljs-operator">+</span><br></code></pre></td></tr></table></figure>

<p>然后进入到 redis 目录，进入 redis-6.0.5，然后执行 make，控制台会输出一编译的信息</p>
<p><img src="https://img-blog.csdnimg.cn/b7ed46a55f6c43de92f83f3d742673c3.png" alt="在这里插入图片描述"></p>
<p>最终编译成功后如图：</p>
<p><img src="https://img-blog.csdnimg.cn/6a2f0fff34bf4994ad17b07951111082.png" alt="在这里插入图片描述"></p>
<p><strong>安装</strong><br>输入命令：</p>
<figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs javascript">make <span class="hljs-variable constant_">PREFIX</span>=<span class="hljs-regexp">/usr/</span>local/redis install<br></code></pre></td></tr></table></figure>

<p>执行结果如下：</p>
<p><img src="https://img-blog.csdnimg.cn/227d346aa6b94232a921d5cf13370f48.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAcXFjb21pbmc=,size_20,color_FFFFFF,t_70,g_se,x_16" alt="在这里插入图片描述"></p>
<p>自此 redis 就安装成功了。可以输入命令查看安装的 redis 版本</p>
<p><img src="https://img-blog.csdnimg.cn/52a9d71d42364f8eadfdbfab8a2da98d.png" alt="在这里插入图片描述"></p>
<p><strong>make install 安装完成后，会在/usr/local/bin 目录下生成下面几个可执行文件，它们的作用分别是：</strong></p>
<p>redis-server：Redis 服务器端启动程序</p>
<p>redis-cli：Redis 客户端操作工具。也可以用 telnet 根据其纯文本协议来操作</p>
<p>redis-benchmark：Redis 性能测试工具</p>
<p>redis-check-aof：数据修复工具</p>
<p>redis-check-dump：检查导出工具</p>
<p><strong>配置 redis</strong></p>
<p>复制配置文件到/usr/local/redis/bin 目录：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-built_in">cp</span> redis.conf /usr/local/redis/bin<br></code></pre></td></tr></table></figure>

<p><strong>修改配置文件</strong></p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-built_in">cd</span>  /usr/local/redis/bin<br>vim redis.conf<br>修改内容<br><span class="hljs-built_in">bind</span> 0.0.0.0<br>requirepass 123456<br></code></pre></td></tr></table></figure>

<p><strong>启动 redis</strong></p>
<p>进入 redis/bin 目录</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-built_in">cd</span> /usr/local/redis/bin<br></code></pre></td></tr></table></figure>

<p><strong>启动 redis 服务端</strong></p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs bash">./redis-server ./redis.conf<br>克隆新窗口，启动redis客户端<br>./redis-cli -a 123456<br></code></pre></td></tr></table></figure>

<h2 id="2-项目部署"><a href="#2-项目部署" class="headerlink" title="2. 项目部署"></a>2. 项目部署</h2><p>我们开发的项目绝大部分情况下都需要部署在 Linux 系统中。我们将通过两种方式，来演示项目部署，分别是：手动部署项目和基于 shell 脚本自动部署。</p>
<p><strong>1). 在 IDEA 中开发 SpringBoot 项目并打成 jar 包</strong></p>
<p>项目是一个很简单的 springboot 项目，结构如下：</p>
<p><img src="https://img2023.cnblogs.com/blog/3320065/202311/3320065-20231114194801770-962843786.png" alt="img"></p>
<p>可以在本地的 idea 中先启动当前的 demo 工程，然后访问一下，看看工程是否正常访问。</p>
<p><img src="https://img2023.cnblogs.com/blog/3320065/202311/3320065-20231114194816338-428782448.png" alt="img"></p>
<p>执行 package 指令，进行打包操作，将当前的 springboot 项目，打成一个 jar 包。</p>
<p><img src="https://img2023.cnblogs.com/blog/3320065/202311/3320065-20231114194827381-148478801.png" alt="img"></p>
<p><strong>2). 将 jar 包上传到 Linux 服务器</strong></p>
<p>通过 rz 指令，将打好的 jar 包上传至 Linux 服务器的 /usr/local/app 目录下。 先执行指令创建 app 目录。</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><code class="hljs bash">A. 在/usr/local下创建目录app<br><span class="hljs-built_in">mkdir</span> /usr/local/app<br><br>B. 切换到app目录下<br><span class="hljs-built_in">cd</span> /usr/local/app<br><br>C. 执行指令,进行jar包上传<br>rz<br></code></pre></td></tr></table></figure>

<p><img src="https://img2023.cnblogs.com/blog/3320065/202311/3320065-20231114194841261-67281042.png" alt="img"></p>
<p>此时这个 jar 包就上传到 /usr/local/app 目录了。</p>
<p><img src="https://img2023.cnblogs.com/blog/3320065/202311/3320065-20231114194857481-1117646798.png" alt="img"></p>
<p><strong>3). 启动 SpringBoot 程序</strong></p>
<p>由于我们的项目已经打成 jar 包上传上来到 Linux 服务器，我们只需要运行这个 jar 包项目就启动起来了，所以只需要执行如下指令即可：</p>
<figure class="highlight mipsasm"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs mipsasm"><span class="hljs-keyword">java </span>-<span class="hljs-keyword">jar </span>helloworld<span class="hljs-number">-1</span>.<span class="hljs-number">0</span>-SNAPSHOT.<span class="hljs-keyword">jar</span><br></code></pre></td></tr></table></figure>

<p><img src="https://img2023.cnblogs.com/blog/3320065/202311/3320065-20231114194946848-1748581320.png" alt="img"></p>
<p>注意： 由于前面安装的 Tomcat 在启动时，会占用端口号 8080，而当前 springboot 项目我们没有配置端口号，默认也是 8080，所以我们要想启动 springboot 项目，需要把之前运行的 Tomcat 停止掉。</p>
<p><strong>4). 检查防火墙，确保 8080 端口对外开放，访问 SpringBoot 项目</strong></p>
<figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs cpp">firewall-cmd --zone=<span class="hljs-keyword">public</span> --list-ports<br></code></pre></td></tr></table></figure>

<p><img src="https://img2023.cnblogs.com/blog/3320065/202311/3320065-20231114195014302-2051548396.png" alt="img"></p>
<p>如果防火墙没有放开 8080 端口，还需要放开对应的端口号，执行如下指令：</p>
<figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs csharp">firewall-cmd --zone=<span class="hljs-keyword">public</span> --<span class="hljs-keyword">add</span>-port=<span class="hljs-number">8080</span>/tcp --permanent<br></code></pre></td></tr></table></figure>

<p><strong>5). 访问测试</strong></p>
<p><a target="_blank" rel="noopener" href="http://192.168.138.130:8080/hello">http://192.168.138.130:8080/hello</a></p>
<p><img src="https://img2023.cnblogs.com/blog/3320065/202311/3320065-20231114195032978-17180135.png" alt="img"></p>
<p><strong>6). 后台运行项目</strong></p>
<p>当前这个 demo 工程我们已经部署成功了，并且我们也可以访问项目了。但是这个工程目前是存在问题的，就是当前我们项目启动的这个窗口被霸屏占用了，如果我们把这个窗口关闭掉(或 ctrl+c)，当前服务也就访问不到了，我们可以试一下。</p>
<p><img src="https://img2023.cnblogs.com/blog/3320065/202311/3320065-20231114195048293-633044122.png" alt="img"></p>
<p><img src="https://img2023.cnblogs.com/blog/3320065/202311/3320065-20231114195101606-2127845446.png" alt="img"></p>
<p><strong>目前程序运行的问题：</strong></p>
<p>A. 线上程序不会采用控制台霸屏的形式运行程序，而是将程序在后台运行</p>
<p>B. 线上程序不会将日志输出到控制台，而是输出到日志文件，方便运维查阅信息</p>
<p><strong>后台运行程序:</strong></p>
<p>要想让我们部署的项目进行后台运行，这个时候我们需要使用到 linux 中的一个命令 nohup ，接下来，就来介绍一下 nohup 命令。</p>
<blockquote>
<p><strong>nohup 命令：</strong>英文全称 no hang up（不挂起），用于不挂断地运行指定命令，退出终端不会影响程序的运行</p>
<p><strong>语法格式：</strong> nohup Command [ Arg … ] [&amp;]</p>
<p><strong>参数说明：</strong></p>
<p>Command：要执行的命令</p>
<p>Arg：一些参数，可以指定输出文件</p>
<p>&amp;：让命令在后台运行</p>
<p><strong>举例：</strong></p>
<p>nohup java -jar boot 工程.jar &amp;&gt; hello.log &amp;</p>
<p>上述指令的含义为： 后台运行 java -jar 命令，并将日志输出到 hello.log 文件</p>
</blockquote>
<p>那么经过上面的介绍，我们可以推测中，我们要想让当前部署的项目后台运行，就可以使用下面的指令：</p>
<figure class="highlight mipsasm"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs mipsasm">nohup <span class="hljs-keyword">java </span>-<span class="hljs-keyword">jar </span>helloworld<span class="hljs-number">-1</span>.<span class="hljs-number">0</span>-SNAPSHOT.<span class="hljs-keyword">jar </span>&amp;&gt; hello.log &amp;<br></code></pre></td></tr></table></figure>

<p><img src="https://img2023.cnblogs.com/blog/3320065/202311/3320065-20231114195128430-1619720036.png" alt="img"></p>
<p>这样的话，我们的项目就已经启动成功了，我们可以通过 ps 指令，查看到系统的进程。</p>
<p><img src="https://img2023.cnblogs.com/blog/3320065/202311/3320065-20231114195147081-373630887.png" alt="img"></p>
<p>接下来，我们再次访问我们的项目，来看看服务是否可用。</p>
<p><img src="https://img2023.cnblogs.com/blog/3320065/202311/3320065-20231114195159321-1659749464.png" alt="img"></p>
<p><strong>7). 停止 SpringBoot 项目</strong></p>
<p><img src="https://img2023.cnblogs.com/blog/3320065/202311/3320065-20231114195212334-575191513.png" alt="img"></p>
<h3 id="2-2-基于-Shell-脚本自动部署"><a href="#2-2-基于-Shell-脚本自动部署" class="headerlink" title="2.2 基于 Shell 脚本自动部署"></a>2.2 基于 Shell 脚本自动部署</h3><h4 id="2-2-1-介绍"><a href="#2-2-1-介绍" class="headerlink" title="2.2.1 介绍"></a>2.2.1 介绍</h4><p>前面介绍的项目部署是手动部署，也就是部署过程中的每一步操作都需要我们手动操作。接下来，我们需要再讲解一下项目的自动部署，从而来简化项目部署的操作，那么我们先来整体上了解一下项目自动部署的流程及操作步骤。</p>
<p><img src="https://img2023.cnblogs.com/blog/3320065/202311/3320065-20231114195235971-1139378360.png" alt="img"></p>
<p>操作步骤如下：</p>
<p>1). 在 Gitee 上创建远程仓库，并将本地的项目代码推送到远程仓库中</p>
<p>2). 在 Linux 中安装 Git,克隆代码</p>
<p>3). 在 Linux 中安装 maven</p>
<p>4). 编写 Shell 脚本（拉取代码、编译、打包、启动）</p>
<p>5). 为用户授予执行 Shell 脚本的权限</p>
<p>6). 执行 Shell 脚本</p>
<h4 id="2-2-2-推送代码到远程"><a href="#2-2-2-推送代码到远程" class="headerlink" title="2.2.2 推送代码到远程"></a>2.2.2 推送代码到远程</h4><p>这部分操作，大家只需要参考之前讲解的 Git，来完成 helloworld 工程代码推送即可。</p>
<p>A. 创建远程仓库</p>
<p><img src="https://img2023.cnblogs.com/blog/3320065/202311/3320065-20231114195251202-822586625.png" alt="img"></p>
<p>B. 将 idea 中的代码提交并推送到远程仓库</p>
<p><img src="https://img2023.cnblogs.com/blog/3320065/202311/3320065-20231114195310917-1234558112.png" alt="img"></p>
<p><img src="https://img2023.cnblogs.com/blog/3320065/202311/3320065-20231114195318651-73381584.png" alt="img"></p>
<h4 id="2-2-3-Git-操作"><a href="#2-2-3-Git-操作" class="headerlink" title="2.2.3 Git 操作"></a>2.2.3 Git 操作</h4><p>1). Git 软件安装</p>
<p>通过 yum 命令在线安装 git，执行如下指令：</p>
<figure class="highlight mipsasm"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs mipsasm">yum list git			列出git安装包<br>yum <span class="hljs-keyword">install </span>git			在线安装git<br></code></pre></td></tr></table></figure>

<p>通过上述指令，安装好 git 之后，我们就可以通过 git –version 去验证 git 的环境。</p>
<p><img src="https://img2023.cnblogs.com/blog/3320065/202311/3320065-20231114195330765-1674734765.png" alt="img"></p>
<p>2). Git 克隆代码</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-built_in">cd</span> /usr/local/<br>git <span class="hljs-built_in">clone</span> https://gitee.com/ChuanZhiBoKe/helloworld.git<br></code></pre></td></tr></table></figure>

<p><img src="https://img2023.cnblogs.com/blog/3320065/202311/3320065-20231114195345098-1503938369.png" alt="img"></p>
<h4 id="2-2-4-Maven-安装"><a href="#2-2-4-Maven-安装" class="headerlink" title="2.2.4 Maven 安装"></a>2.2.4 Maven 安装</h4><p>由于我们的工程是 maven 工程，我们要想进行项目的编译打包，需要用到 maven 的指令，所以需要安装 maven。具体操作步骤如下：</p>
<p><strong>1). 上传 maven 的安装包</strong></p>
<p>通过 rz 指令上传 maven 安装包</p>
<p><img src="https://img2023.cnblogs.com/blog/3320065/202311/3320065-20231114195434846-415964903.png" alt="img"></p>
<p><img src="https://img2023.cnblogs.com/blog/3320065/202311/3320065-20231114195441713-916242931.png" alt="img"></p>
<p><strong>2). 解压 maven 安装包到/usr/local 目录</strong></p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">tar -zxvf apache-maven-3.5.4-bin.tar.gz -C /usr/local<br></code></pre></td></tr></table></figure>

<p><img src="https://img2023.cnblogs.com/blog/3320065/202311/3320065-20231114195456477-836049203.png" alt="img"></p>
<p><strong>3). 在/etc/profile 配置文件中配置环境变量</strong></p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><code class="hljs bash">vim /etc/profile<br><br>修改配置文件，进入到命令模式，按G切换到最后一行，按a/i/o进入插入模式，然后在最后加入如下内容 :<br><span class="hljs-built_in">export</span> MAVEN_HOME=/usr/local/apache-maven-3.5.4<br><span class="hljs-built_in">export</span> PATH=<span class="hljs-variable">$PATH</span>:<span class="hljs-variable">$MAVEN_HOME</span>/bin<br><br>然后按ESC进入到命令模式，输入 :wq 保存并退出<br></code></pre></td></tr></table></figure>

<p><img src="https://img2023.cnblogs.com/blog/3320065/202311/3320065-20231114195521509-482977832.png" alt="img"></p>
<p>要想让配置的环境变量生效,还需要执行如下指令:</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-built_in">source</span> /etc/profile<br></code></pre></td></tr></table></figure>

<p><img src="https://img2023.cnblogs.com/blog/3320065/202311/3320065-20231114195537378-1082427980.png" alt="img"></p>
<p><strong>4). 修改 maven 的 settings.xml 配置文件,配置本地仓库地址</strong></p>
<p>A. 切换目录</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-built_in">cd</span> /usr/local/apache-maven-3.5.4/conf<br></code></pre></td></tr></table></figure>

<p>B. 编辑 settings.xml 配置文件</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs undefined">vim settings.xml<br></code></pre></td></tr></table></figure>

<p>在其中增加如下配置,配置本地仓库地址:</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">&lt;localRepository&gt;/usr/local/repo&lt;/localRepository&gt;<br></code></pre></td></tr></table></figure>

<p><img src="https://img2023.cnblogs.com/blog/3320065/202311/3320065-20231114195555597-1721631217.png" alt="img"></p>
<p>并在 settings.xml 中的标签中,配置阿里云的私服(选做):</p>
<figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><code class="hljs xml"><span class="hljs-tag">&lt;<span class="hljs-name">mirror</span>&gt;</span><br>    <span class="hljs-tag">&lt;<span class="hljs-name">id</span>&gt;</span>alimaven<span class="hljs-tag">&lt;/<span class="hljs-name">id</span>&gt;</span><br>    <span class="hljs-tag">&lt;<span class="hljs-name">mirrorOf</span>&gt;</span>central<span class="hljs-tag">&lt;/<span class="hljs-name">mirrorOf</span>&gt;</span><br>    <span class="hljs-tag">&lt;<span class="hljs-name">name</span>&gt;</span>aliyun maven<span class="hljs-tag">&lt;/<span class="hljs-name">name</span>&gt;</span><br>    <span class="hljs-tag">&lt;<span class="hljs-name">url</span>&gt;</span>http://maven.aliyun.com/nexus/content/groups/public/<span class="hljs-tag">&lt;/<span class="hljs-name">url</span>&gt;</span><br><span class="hljs-tag">&lt;/<span class="hljs-name">mirror</span>&gt;</span><br></code></pre></td></tr></table></figure>

<p><img src="https://img2023.cnblogs.com/blog/3320065/202311/3320065-20231114195612156-1951542592.png" alt="img"></p>
<h4 id="2-2-5-Shell-脚本准备"><a href="#2-2-5-Shell-脚本准备" class="headerlink" title="2.2.5 Shell 脚本准备"></a>2.2.5 Shell 脚本准备</h4><blockquote>
<p>Shell 脚本（shell script），是一种 Linux 系统中的脚本程序。使用 Shell 脚本编程跟 JavaScript、Java 编程一样，只要有一个能编写代码的文本编辑器和一个能解释执行的脚本解释器就可以了。</p>
</blockquote>
<p>在/usr/local/目录下创建一个目录 sh(mkdir sh)，并将 shell 脚本上传到该目录下。或者直接在 sh 目录下创建一个脚本 bootStart.sh，然后将 bootStart.sh 脚本文件打开,内容拷贝过来即可。</p>
<p><img src="https://img2023.cnblogs.com/blog/3320065/202311/3320065-20231114195626477-2064113806.png" alt="img"></p>
<p><strong>脚本解读:</strong></p>
<p><img src="https://img2023.cnblogs.com/blog/3320065/202311/3320065-20231114195707307-1858017060.png" alt="img"></p>
<h4 id="2-2-6-Linux-权限"><a href="#2-2-6-Linux-权限" class="headerlink" title="2.2.6 Linux 权限"></a>2.2.6 Linux 权限</h4><p>前面我们已经把 Shell 脚本准备好了，但是 Shell 脚本要想正常的执行，还需要给 Shell 脚本分配执行权限。 由于 linux 系统是一个多用户的操作系统，并且针对每一个用户，Linux 会严格的控制操作权限。接下来，我们就需要介绍一下 Linux 系统的权限控制。</p>
<blockquote>
<p>1). chmod（英文全拼：change mode）命令是控制用户对文件的权限的命令</p>
<p>2). Linux 中的权限分为三种 ：读(r)、写(w)、执行(x)</p>
<p>3). Linux 文件权限分为三级 : 文件所有者（Owner）、用户组（Group）、其它用户（Other Users）</p>
<p>4). 只有文件的所有者和超级用户可以修改文件或目录的权限</p>
<p>5). 要执行 Shell 脚本需要有对此脚本文件的执行权限(x)，如果没有则不能执行</p>
</blockquote>
<p>Linux 系统中权限描述如下:</p>
<p><img src="https://img2023.cnblogs.com/blog/3320065/202311/3320065-20231114195820098-1537206501.png" alt="img"></p>
<p>解析当前脚本的权限情况:</p>
<p><img src="https://img2023.cnblogs.com/blog/3320065/202311/3320065-20231114195832320-341752078.png" alt="img"></p>
<p>chmod 命令可以使用八进制数来指定权限(0 - 代表无 , 1 - 执行 x , 2 - 写 w , 4 - 读 r):</p>
<table>
<thead>
<tr>
<th>值</th>
<th>权限</th>
<th>rwx</th>
</tr>
</thead>
<tbody><tr>
<td>7</td>
<td>读 + 写 + 执行</td>
<td>rwx</td>
</tr>
<tr>
<td>6</td>
<td>读 + 写</td>
<td>rw-</td>
</tr>
<tr>
<td>5</td>
<td>读 + 执行</td>
<td>r-x</td>
</tr>
<tr>
<td>4</td>
<td>只读</td>
<td>r–</td>
</tr>
<tr>
<td>3</td>
<td>写 + 执行</td>
<td>-wx</td>
</tr>
<tr>
<td>2</td>
<td>只写</td>
<td>-w-</td>
</tr>
<tr>
<td>1</td>
<td>只执行</td>
<td>–x</td>
</tr>
<tr>
<td>0</td>
<td>无</td>
<td>—</td>
</tr>
</tbody></table>
<p><strong>举例:</strong></p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-built_in">chmod</span> 777 bootStart.sh   为所有用户授予读、写、执行权限<br><span class="hljs-built_in">chmod</span> 755 bootStart.sh   为文件拥有者授予读、写、执行权限，同组用户和其他用户授予读、执行权限<br><span class="hljs-built_in">chmod</span> 210 bootStart.sh   为文件拥有者授予写权限，同组用户授予执行权限，其他用户没有任何权限<br></code></pre></td></tr></table></figure>

<p>注意:</p>
<p>三个数字分别代表不同用户的权限</p>
<ul>
<li>第 1 位表示文件拥有者的权限</li>
<li>第 2 位表示同组用户的权限</li>
<li>第 3 位表示其他用户的权限</li>
</ul>
<h4 id="2-2-7-授权并执行脚本"><a href="#2-2-7-授权并执行脚本" class="headerlink" title="2.2.7 授权并执行脚本"></a>2.2.7 授权并执行脚本</h4><p>在测试阶段，我们可以给所有的人都赋予执行该 shell 脚本的权限。所以可以执行如下指令：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-built_in">chmod</span> 777 bootStart.sh<br></code></pre></td></tr></table></figure>

<p><img src="https://img2023.cnblogs.com/blog/3320065/202311/3320065-20231114195848722-1105080188.png" alt="img"></p>
<p>权限解读:</p>
<p>A. 第一个 7，代表当前文件所有者 root 用户，对该文件具有读写执行权限；</p>
<p>B. 第二个 7，代表当前文件所有者所属组的用户，对该文件具有读写执行权限；</p>
<p>B. 第三个 7，代表其他用户，对该文件具有读写执行权限；</p>
<p>执行该 shell 脚本:</p>
<p><img src="https://img2023.cnblogs.com/blog/3320065/202311/3320065-20231114195905909-134421838.png" alt="img"></p>
<p>注意： 在执行 maven 指令进行打包时，第一次执行可能会耗时比较长，因为在进行 maven 工程的打包时，需要到中央仓库下载工程依赖的 jar 包和插件(可以在 settings.xml 中配置阿里云私服加速下载)。</p>
<p>启动完成之后, 我们可以查看 java 进程：</p>
<p><img src="https://img2023.cnblogs.com/blog/3320065/202311/3320065-20231114195919955-110401481.png" alt="img"></p>
<p>访问项目：</p>
<p><img src="https://img2023.cnblogs.com/blog/3320065/202311/3320065-20231114195929301-1827238995.png" alt="img"></p>
<h4 id="2-2-8-设置静态-IP"><a href="#2-2-8-设置静态-IP" class="headerlink" title="2.2.8 设置静态 IP"></a>2.2.8 设置静态 IP</h4><p>我们目前安装的 Linux 操作系统，安装完毕之后并没有配置 IP 地址，默认 IP 地址是动态获取的，那如果我们使用该 Linux 服务器部署项目，IP 动态获取的话，也就意味着，IP 地址可能会发生变动，那我们访问项目的话就会非常繁琐，所以作为服务器，我们一般还需要把 IP 地址设置为静态的。</p>
<p>1). 设置静态 IP</p>
<p>设置静态 ip，我们就需要修改 /etc/sysconfig/network-scripts/ifcfg-ens33 配置文件，内容如下：</p>
<figure class="highlight properties"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><code class="hljs properties"><span class="hljs-attr">BOOTPROTO</span>=<span class="hljs-string">static</span><br><span class="hljs-attr">IPADDR</span>=<span class="hljs-string">&quot;192.168.138.100&quot;        # 设置的静态IP地址</span><br><span class="hljs-attr">NETMASK</span>=<span class="hljs-string">&quot;255.255.255.0&quot;         # 子网掩码</span><br><span class="hljs-attr">GATEWAY</span>=<span class="hljs-string">&quot;192.168.138.2&quot;         # 网关地址</span><br><span class="hljs-attr">DNS1</span>=<span class="hljs-string">&quot;192.168.138.2&quot;            # DNS服务器</span><br></code></pre></td></tr></table></figure>

<p><img src="https://img2023.cnblogs.com/blog/3320065/202311/3320065-20231114195941970-53914880.png" alt="img"></p>
<p>上述我们所设置的网段为 138，并不是随意指定的，需要和我们虚拟机中的虚拟网络编辑器中的 NAT 模式配置的网关保持一致。</p>
<p><img src="https://img2023.cnblogs.com/blog/3320065/202311/3320065-20231114195953668-73641573.png" alt="img"></p>
<p>2). 重启网络服务</p>
<p>ip 地址修改完毕之后，需要重启网络服务，执行如下指令：</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs undefined">systemctl restart network<br></code></pre></td></tr></table></figure>

<p><img src="https://img2023.cnblogs.com/blog/3320065/202311/3320065-20231114200004068-310838281.png" alt="img"></p>
<p>注意：重启完网络服务后 ip 地址已经发生了改变，此时 FinalShell 已经连接不上 Linux 系统，需要创建一个新连接才能连接到 Linux。</p>
<p>再次连接上 Linux 之后，我们再次查看 IP 地址，就可以看到我们所设置的静态 IP：</p>
<p><img src="https://img2023.cnblogs.com/blog/3320065/202311/3320065-20231114200013270-1287830736.png" alt="img"></p>

                
              </div>
            
            <hr/>
            <div>
              <!-- 文章页面 - 底部标签 -->
<div class="post-metas my-3">
  
  <div class="post-meta mr-3 d-flex align-items-center">
    <i class="iconfont icon-category"></i>
    <!-- 归档页 - 文章列表 -->


<span class="category-chains">
  
  
    
      <span class="category-chain">
        
  <a href="/blog/categories/%E9%83%A8%E7%BD%B2%E4%B9%8B%E9%81%93/" class="category-chain-item">部署之道</a>
  
  

      </span>
    
  
</span>

  </div>
   
  <div class="post-meta">
    <i class="iconfont icon-tags"></i>
    
    <a href="/blog/tags/%E7%BB%8F%E9%AA%8C/">#经验</a>
    
    <a href="/blog/tags/Linux/">#Linux</a>
    
    <a href="/blog/tags/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/">#操作系统</a>
    
  </div>
  
</div>


              <!-- 文章页面 - 底部标签下方 -->

  
  <div class="license-box my-3">
    <div class="license-title">
      <div>掌握Linux基础命令：入门到实践</div>
      <div>https://test.atomgit.net/blog/2023/03/22/掌握 Linux 基础命令：入门到实践/</div>
    </div>
    <div class="license-meta">
      
        <div class="license-meta-item">
          <div>作者</div>
          <div>Memory</div>
        </div>
      
      
        <div class="license-meta-item license-meta-date">
          <div>发布于</div>
          <div>2023年3月22日</div>
        </div>
      
      
        <div class="license-meta-item license-meta-date">
          <div>更新于</div>
          <div>2024年9月26日</div>
        </div>
      
      
        <div class="license-meta-item">
          <div>许可协议</div>
          <div>
            
              
              
                <a target="_blank" href="https://creativecommons.org/licenses/by/4.0/">
                  <span class="hint--top hint--rounded" aria-label="BY - 署名">
                    <i class="iconfont icon-by"></i>
                  </span>
                </a>
              
            
          </div>
        </div>
      
    </div>
    <div class="license-icon iconfont"></div>
  </div>



              
                <div class="post-prevnext my-3">
                  <article class="post-prev col-6">
                    
                    
                      <a href="/blog/2023/03/23/%E6%96%87%E5%BE%84%E9%80%9A%E5%B9%BD%EF%BC%9A%E6%AC%A2%E8%BF%8E%E8%B5%B0%E8%BF%9B%E6%88%91%E7%9A%84%E6%96%87%E5%AD%97%E4%B8%96%E7%95%8C/" title="文径通幽：欢迎走进我的文字世界">
                        <i class="iconfont icon-arrowleft"></i>
                        <span class="hidden-mobile">文径通幽：欢迎走进我的文字世界</span>
                        <span class="visible-mobile">上一篇</span>
                      </a>
                    
                  </article>
                  <article class="post-next col-6">
                    
                    
                      <a href="/blog/2023/03/22/MySQL%E4%BB%8E%E5%85%A5%E9%97%A8%E5%88%B0%E5%85%A5%E5%9C%9F/" title="MySQL从入门到入土">
                        <span class="hidden-mobile">MySQL从入门到入土</span>
                        <span class="visible-mobile">下一篇</span>
                        <i class="iconfont icon-arrowright"></i>
                      </a>
                    
                  </article>
                </div>
              
            </div>

            <!-- 文章页 - 评论上方 -->

  
  
    <article id="comments">
      
  <div id="valine"></div>
  <script type="text/javascript">
    Fluid.utils.loadComments('#valine', function() {
      Fluid.utils.createScript('https://cdn.jsdelivr.net/gh/HCLonely/Valine@latest/dist/Valine.min.js', function() {
        var options = Object.assign(
          {"appId":"T1hUHH9Ks1ggG9DBE3HgUPpV-gzGzoHsz","appKey":"XFkgzzvzNo3J3uNCbBiSOFKc","path":"window.location.pathname","placeholder":"填取QQ号和邮箱后评论，支持读取头像及消息提醒，留下点什么叭... ᶘ ᵒᴥᵒᶅ","avatar":"Gravatar","meta":["nick","mail","link"],"requiredFields":[],"pageSize":10,"lang":"zh-CN","highlight":true,"recordIP":false,"serverURLs":"https://t1huhh9k.lc-cn-n1-shared.com","emojiCDN":null,"emojiMaps":null,"enableQQ":true,"master":"8c9b6d6637904da62d74d019cc6982de","friends":"0188229a9cfc284176ea9135cb9514cc","visitor":true},
          {
            el: "#valine",
            path: window.location.pathname,
            app_id: "",
            app_key: "",
            placeholder: "填取QQ号和邮箱后评论，支持读取头像及消息提醒，留下点什么叭... ᶘ ᵒᴥᵒᶅ",
            avatar: "Gravatar",
            meta: ["nick","mail","link"],
            pageSize: "10",
            lang: "zh-CN",
            highlight: true,
            recordIP: false,
            serverURLs: "https://t1huhh9k.lc-cn-n1-shared.com",

            // 设置Bilibili表情包地址
            emojiCDN: '//i0.hdslb.com/bfs/emote/', 
            // 表情title和图片映射
            emojiMaps: {
                "tv_白眼": "48f75163437445665a9be80bb316e4cb252c5415.gif@48w_48h.webp",
                "tv_doge": "302d6c88c63ed162c81a49cafe7ed2709e6fb955.gif@48w_48h.webp",
                "tv_坏笑": "5d2572efd09aab5dde9e2a198bb3f9ac1e2a982e.gif@48w_48h.webp",
                "tv_难过": "9c6b41008a67755410f712334c64313df5f91b3f.gif@48w_48h.webp",
                "tv_生气": "1902a5a2df5b5c931d88c12f0feb264b1e109d0d.gif@48w_48h.webp",
                "tv_委屈": "af5a5853edb43a8178a8cb5df707fa5e88143699.gif@48w_48h.webp",
                "tv_斜眼笑": "c66568b471192ca1f62f6ed4384dc1b283ab7508.gif@48w_48h.webp",
                "tv_呆": "d3fa91e4db9215eb1e20ab9da44f1214aa4bda7b.gif@48w_48h.webp",
                "tv_发怒": "3959eb81b952e4fa8d269d98f9e3639172d84073.gif@48w_48h.webp",
                "tv_呕吐": "db58e9442aae26694af18cc1683607cca3a16763.gif@48w_48h.webp",
                "tv_思考": "b63f9146bfd985af014f8d6d4bdb498805be48f9.gif@48w_48h.webp",
                "tv_微笑": "b98656855d782f61cb8edc7f7fca6563ecafff7e.gif@48w_48h.webp",
                "tv_疑问": "fce1b1a0f3b0e39a2dc16a18508dba7b91e929f4.gif@48w_48h.webp",
                "tv_大哭": "cba61f05f3039b02a7ffc0dfcd9d7995df9fdd74.gif@48w_48h.webp",
                "tv_鼓掌": "be106e6b265883a9f28fbe10f7b765701e2618d4.gif@48w_48h.webp",
                "tv_抠鼻": "696d9f93e722144dc2a78aeffc569418fdf3d565.gif@48w_48h.webp",
                "tv_亲亲": "3534ea44ab74bd20352b88c245a06c4b4c46d271.gif@48w_48h.webp",
                "tv_调皮": "fcd967395fd14e4dd5829fa7e8a967ce23205e52.gif@48w_48h.webp",
                "tv_笑哭": "1c2fd1e8c9dde12812f86e5d4cbddd8993d98082.gif@48w_48h.webp",
                "tv_晕": "030040ec5c9ddc9e3d067658c4139e7314ab42f8.gif@48w_48h.webp",
                "tv_点赞": "30ecff401245fb56bcc1cf588d1809ac1ab1607c.gif@48w_48h.webp",
                "tv_害羞": "411a3e459e8580f5bfd9f639a408247c4b509935.gif@48w_48h.webp",
                "tv_睡着": "3c8b5e293261287a6203597e29b3de07df4d18c6.gif@48w_48h.webp",
                "tv_色": "a0c6d99ab0ab63b8648f5283ff72cec04b604828.gif@48w_48h.webp",
                "tv_吐血": "e17e4539e169d14a3389ff147afea760cebe5de5.gif@48w_48h.webp",
                "tv_无奈": "eb4cb5f07cfd177c7e6a7914316717e56d9cc1d0.gif@48w_48h.webp",
                "tv_再见": "344f61609ecce2008520dc8a977b6169215748a9.gif@48w_48h.webp",
                "tv_流汗": "390bccec65eaff536bd5bb2a0c5b8b0bdea47334.gif@48w_48h.webp",
                "tv_偷笑": "7f11e6f7f63e79112b833bd41fa13a83d7cd8474.gif@48w_48h.webp",
                "tv_抓狂":"a476b93ecd8e94ac3257323fd822f91cef212de2.gif@48w_48h.webp",
                "tv_黑人问号":"b609adf664be33224a9923262031165ae3e34cd2.gif@48w_48h.webp",
                "tv_困":"91c2bf34ecf842d7016c01d841db3d4074bd281f.gif@48w_48h.webp",
                "tv_打脸":"b0fad4856e59c1240e448437da3287bb5ce547e5.gif@48w_48h.webp",
                "tv_闭嘴":"a3fc5388b09e945be3f18fe23bfed5874a0285b7.gif@48w_48h.webp",
                "tv_鄙视":"293b5d459e6264ecf314d20937a936fa672ccd1e.gif@48w_48h.webp",
                "tv_腼腆":"30984e8264324f901d19bea85dada7103b695534.gif@48w_48h.webp",
                "tv_馋":"2525c5703c594e5f0752f68db8948773caebde47.gif@48w_48h.webp",
                "tv_可爱":"f92d20f76258bc5f33fc9d7c5e2a1d41fef19a7c.gif@48w_48h.webp",
                "tv_发财":"76131e52c9b033681b4c896c6024d29ef7ec7ec2.gif@48w_48h.webp",
                "tv_生病":"beb94829fe04f1a41bd6ca611e1f6ca9ca169afa.gif@48w_48h.webp",
                "tv_流鼻血":"8ef473f74a849420da712487b2f56ecca1f695f5.gif@48w_48h.webp",
                "tv_尴尬":"e0b84ef5ee3e5b8978e584c7c5a6550c51d15f84.gif@48w_48h.webp",
                "tv_大佬":"14ca0c05382b8741940942b2430b7a8d55c02f7e.gif@48w_48h.webp",
                "tv_流泪":"7e71cde7858f0cd50d74b0264aa26db612a8a167.png@48w_48h.webp",
                "tv_冷漠":"b9cbc755c2b3ee43be07ca13de84e5b699a3f101.png@48w_48h.webp",
                "tv_皱眉":"72ccad6679fea0d14cce648b4d818e09b8ffea2d.png@48w_48h.webp",
                "tv_鬼脸":"0ffbbddf8a94d124ca2f54b360bbc04feb6bbfea.png@48w_48h.webp",
                "tv_调侃":"4bc022533ef31544ca0d72c12c808cf4a1cce3e3.png@48w_48h.webp",
                "tv_目瞪口呆":"0b8cb81a68de5d5365212c99375e7ace3e7891b7.png@48w_48h.webp",
            },

            master: "8c9b6d6637904da62d74d019cc6982de",
            friends: "0188229a9cfc284176ea9135cb9514cc",
            tagMeta: ["博主","友人","访客"],
            visitor: true // 阅读量统计
          }
        )
        new Valine(options);
        Fluid.utils.waitElementVisible('#valine .vcontent', () => {
          var imgSelector = '#valine .vcontent img:not(.vemoji)';
          Fluid.plugins.imageCaption(imgSelector);
          Fluid.plugins.fancyBox(imgSelector);
        })
      });
    });
  </script>
  <noscript>Please enable JavaScript to view the comments</noscript>


    </article>
  


          </article>
        </div>
      </div>
    </div>

    <div class="side-col d-none d-lg-block col-lg-2">
      <!-- 文章页面 - 右侧目录 -->

  <aside class="sidebar" style="margin-left: -1rem">
    <!-- 文章页面 - 右侧目录上方 -->
<div id="toc">
  <p class="toc-header">
    <i class="iconfont icon-list"></i>
    <span>目录</span>
  </p>
  <div class="toc-body" id="toc-body"></div>
</div>



  </aside>



    </div>
  </div>
</div>





  



  



  



  



  







    

    
      <a id="scroll-top-button" aria-label="TOP" href="#" role="button">
        <i class="iconfont icon-arrowup" aria-hidden="true"></i>
      </a>
    

    
      <!-- 博客 - 搜索框 -->
<div
  class="modal fade"
  id="modalSearch"
  tabindex="-1"
  role="dialog"
  aria-labelledby="ModalLabel"
  aria-hidden="true"
>
  <div class="modal-dialog modal-dialog-scrollable modal-lg" role="document">
    <div class="modal-content">
      <div class="modal-header text-center">
        <h4 class="modal-title w-100 font-weight-bold">
          搜索
        </h4>
        <button
          type="button"
          id="local-search-close"
          class="close"
          data-dismiss="modal"
          aria-label="Close"
        >
          <span aria-hidden="true">&times;</span>
        </button>
      </div>
      <div class="modal-body mx-3">
        <div class="md-form mb-5">
          <input
            type="text"
            id="local-search-input"
            class="form-control validate"
          />
          <label data-error="x" data-success="v" for="local-search-input"
            >关键词</label
          >
        </div>
        <div class="list-group" id="local-search-result"></div>
      </div>
    </div>
  </div>
</div>

    

    
        <div class="modal fade" id="modalNotice" tabindex="-1" role="dialog" aria-hidden="true"
     style="font-family: 'Ma Shan Zheng', cursive; color: #ffffff;">
    <div class="modal-dialog modal-dialog-scrollable" role="document"
         style="font-family: 'Ma Shan Zheng', cursive;">
        <div class="modal-content" style="border-radius: 6px;">
            <!-- 公告头部 - 响应式设计 -->
            <div class="modal-header text-center"
                 style="padding: 1rem 1.5rem;border-bottom: 1px solid rgba(255,255,255,0.2)">
                <h4 class="modal-title w-100 font-weight-bold"
                    style="font-family: 'Microsoft YaHei', sans-serif;letter-spacing: 1px;text-shadow: 1px 1px 2px rgba(0,0,0,0.2);color: #ffffff;
                           font-size: 1.5rem; /* 默认PC端大小 */
                           /* 移动端适配 */
                           @media (max-width: 768px) {
                               font-size: 1.2rem;
                           }">
                    <div class="notice-title">
                        <i class="fas fa-bullhorn mr-2"> 围栏告示</i>
                    </div>
                    <small style="display: block; font-family: 'STKaiti', serif; font-size: 0.6em; color: #a0a0a0; margin-top: 3px;">
                        旧梦轻拾 · 谨识
                    </small>
                </h4>
            </div>

            <!-- 公告内容区 - 响应式设计 -->
            <div class="modal-body"
                 style="padding: 2rem; /* PC端 */
                        max-height: 70vh;
                        overflow-y: auto;
                        /* 移动端适配 */
                        @media (max-width: 768px) {
                            padding: 1rem;
                            max-height: 60vh;
                        }">
                <!-- 图片容器（响应式设计） -->
                <!--                <div class="announcement-hero"-->
                <!--                     style="margin-bottom: 2rem; /* PC端 */-->
                <!--                            /* 移动端适配 */-->
                <!--                            @media (max-width: 768px) {-->
                <!--                                margin-bottom: 1rem;-->
                <!--                            }">-->
                <!--                    <img src="http://blog.memory-life.icu/%E3%80%90%E5%93%B2%E9%A3%8E%E5%A3%81%E7%BA%B8%E3%80%91%E5%8A%A8%E6%BC%AB-%E5%A4%95%E9%98%B3%E9%93%81%E8%BD%A8.jpg"-->
                <!--                         alt="时光溯洄题图"-->
                <!--                         style="width: 100%; -->
                <!--                                max-height: 400px; /* PC端 */-->
                <!--                                object-fit: cover;-->
                <!--                                border-radius: 4px; -->
                <!--                                box-shadow: 0 2px 12px rgba(0,0,0,0.1);-->
                <!--                                /* 移动端适配 */-->
                <!--                                @media (max-width: 768px) {-->
                <!--                                    max-height: 30vh;-->
                <!--                                }"-->
                <!--                         loading="lazy">-->
                <!--                </div>-->

                <!-- 静态公告列表 - 响应式设计 -->
                <div class="announcement-list">
                    <div class="announcement-item"
                         style="margin-bottom: 2rem; /* PC端 */
                                padding: 2rem;
                                background: rgba(255,255,255,0.05);
                                border-radius: 8px;
                                /* 移动端适配 */
                                @media (max-width: 768px) {
                                    margin-bottom: 1rem;
                                    padding: 1rem;
                                }">
                        <h2 style="color: #d38532;
                                  font-weight: 600;
                                  font-size: 1.5rem; /* PC端 */
                                  margin-bottom: 1.2rem;
                                  letter-spacing: 0.5px;
                                  /* 移动端适配 */
                                  @media (max-width: 768px) {
                                      font-size: 1.2rem;
                                      margin-bottom: 1rem;
                                  }">
                            <i class="fas fa-calendar-check mr-2"></i>时光溯洄
                            <small style="display: block; font-size: 0.6em; color: #b8b8b8;text-align: right;">——
                                晨昏往事</small>
                        </h2>
                        <div style="color: #e0e0e0;
                                  line-height: 1.8; /* PC端 */
                                  font-size: 1.05rem;
                                  letter-spacing: 0.3px;
                                  /* 移动端适配 */
                                  @media (max-width: 768px) {
                                      line-height: 1.6;
                                      font-size: 0.95rem;
                                  }">
                            <!-- 内容保持不变 -->
                            <p style="margin-bottom: 1rem; text-indent: 2em;">你好。</p>
                            <!-- 其余段落内容... -->
                            <p style="margin-bottom: 1rem; text-indent: 2em;">
                                建站后的第813天，在百忙之中总算又能抽出时间来，对整个博客站点功能做整体的规划及优化完善。</p>
                            <p style="margin-bottom: 1rem; text-indent: 2em;">
                                在刚刚过去的几年时间里，往事皆以笔墨挥毫于时光素笺之上，数百天如一日，故事的书写从未间断过。</p>
                            <p style="margin-bottom: 1rem; text-indent: 2em; font-style: italic; color: #b8b8b8;">
                                时光悠悠，日月如流，过往的蹉跎岁月总在不经意间在心间回眸。</p>
                            <p style="margin-bottom: 1rem; text-indent: 2em; font-weight: 500; color: #ffffff;">
                                俯仰之间，轻舟已过万重山。</p>
                            <p style="margin-bottom: 1rem; text-indent: 2em; font-weight: 500; color: #ffffff;">
                                蹉跎之处，往事皆成云烟散。</p>
                            <p style="margin-bottom: 1rem; text-indent: 2em;">
                                这几年的时光过得太快了，好像过去这段岁月里的所有事情都发生在一瞬间。</p>
                            <p style="margin-bottom: 1rem; text-indent: 2em;">
                                这几年的时光同样太久了，久到那些时日里仿佛囊括了自己的整个前半生。</p>
                            <p style="margin-bottom: 0; text-align: right; font-size: 0.95rem; color: #a0a0a0;">——
                                八百余个昼夜，当时只道是地久天长，如今回望，不过浮光掠影间的一瞬。</p>
                        </div>
                    </div>

                    <!-- 第二个公告项 - 响应式设计 -->
                    <div class="announcement-item"
                         style="margin-bottom: 2rem; /* PC端 */
                                padding: 2rem;
                                background: rgba(255,255,255,0.05);
                                border-radius: 8px;
                                /* 移动端适配 */
                                @media (max-width: 768px) {
                                    margin-bottom: 1rem;
                                    padding: 1rem;
                                }">
                        <h2 style="color: #6cc70b;
                                  font-weight: 600;
                                  font-size: 1.5rem; /* PC端 */
                                  margin-bottom: 1.2rem;
                                  letter-spacing: 0.5px;
                                  /* 移动端适配 */
                                  @media (max-width: 768px) {
                                      font-size: 1.2rem;
                                      margin-bottom: 1rem;
                                  }">
                            <i class="fas fa-book-open mr-2"></i>墨痕新注
                            <small style="display: block; font-size: 0.6em; color: #b8b8b8;text-align: right;">——
                                待起之章</small>
                        </h2>
                        <div style="color: #e0e0e0;
                                  line-height: 1.8; /* PC端 */
                                  font-size: 1.05rem;
                                  letter-spacing: 0.3px;
                                  /* 移动端适配 */
                                  @media (max-width: 768px) {
                                      line-height: 1.6;
                                      font-size: 0.95rem;
                                  }">
                            <!-- 列表内容 - 响应式设计 -->
                            <ul style="padding-left: 1.8rem; /* PC端 */
                                      margin-bottom: 1.5rem;
                                      /* 移动端适配 */
                                      @media (max-width: 768px) {
                                          padding-left: 1.5rem;
                                          margin-bottom: 1.2rem;
                                      }">
                                <li style="margin-bottom: 0.8rem; /* PC端 */
                                         position: relative;
                                         list-style-type: none;
                                         /* 移动端适配 */
                                         @media (max-width: 768px) {
                                             margin-bottom: 0.6rem;
                                         }">
                                    <span style="position: absolute;
                                               left: -1.8rem; /* PC端 */
                                               color: #6cc70b;
                                               /* 移动端适配 */
                                               @media (max-width: 768px) {
                                                   left: -1.5rem;
                                               }">◆</span>
                                    <span style="font-weight: bolder;">溯源计划：</span>新增博文"溯源计划"，旨在用先进的数字技术留住过去的旧时光，让家族的记忆在数字云端生长发芽，全站博文数量已达90+。
                                </li>
                                <li style="margin-bottom: 0.8rem; /* PC端 */
                                         position: relative;
                                         list-style-type: none;
                                         /* 移动端适配 */
                                         @media (max-width: 768px) {
                                             margin-bottom: 0.6rem;
                                         }">
                                    <span style="position: absolute;
                                               left: -1.8rem; /* PC端 */
                                               color: #6cc70b;
                                               /* 移动端适配 */
                                               @media (max-width: 768px) {
                                                   left: -1.5rem;
                                               }">◆</span>
                                    <span style="font-weight: bolder;">围栏告示：</span>自去年夏天站点新增了“评论回复”功能后，至今时隔十余月，在芒种前夕本站久违地上线“围栏告示”功能，本公告栏会不定时更新，持续跟进记录最新站点功能调整日志，更多精彩内容请敬请期待。
                                </li>
                                <li style="margin-bottom: 0.8rem; /* PC端 */
                                         position: relative;
                                         list-style-type: none;
                                         /* 移动端适配 */
                                         @media (max-width: 768px) {
                                             margin-bottom: 0.6rem;
                                         }">
                                    <span style="position: absolute;
                                               left: -1.8rem; /* PC端 */
                                               color: #6cc70b;
                                               /* 移动端适配 */
                                               @media (max-width: 768px) {
                                                   left: -1.5rem;
                                               }">◆</span>
                                    <span style="font-weight: bolder;">图片查看：</span>最近几周时间里，考虑到图文流量费用收取问题，暂时关闭了七牛云对象存储私有空间访问权限，故博文内的图文无法正常预览，择日考虑开启访问权限。
                                </li>
                                <li style="margin-bottom: 0.8rem; /* PC端 */
                                         position: relative;
                                         list-style-type: none;
                                         /* 移动端适配 */
                                         @media (max-width: 768px) {
                                             margin-bottom: 0.6rem;
                                         }">
                                    <span style="position: absolute;
                                               left: -1.8rem; /* PC端 */
                                               color: #6cc70b;
                                               /* 移动端适配 */
                                               @media (max-width: 768px) {
                                                   left: -1.5rem;
                                               }">◆</span>
                                    <span style="font-weight: bolder;">壁纸下载：</span>后续计划实现壁纸下载功能，均为个人收集的共150+超高分辨率精美壁纸，提供在线预览以及下载功能。
                                </li>
                                <li style="margin-bottom: 0.8rem; /* PC端 */
                                         position: relative;
                                         list-style-type: none;
                                         /* 移动端适配 */
                                         @media (max-width: 768px) {
                                             margin-bottom: 0.6rem;
                                         }">
                                    <span style="position: absolute;
                                               left: -1.8rem; /* PC端 */
                                               color: #6cc70b;
                                               /* 移动端适配 */
                                               @media (max-width: 768px) {
                                                   left: -1.5rem;
                                               }">◆</span>
                                    <span style="font-weight: bolder;">阅读体验：</span>规划完善文章内分页功能，并提供“最近更新”的文章列表，计划收录更新率较高的文章，譬如：阳台日记、叙事之外、岁月如歌、游戏人生等等，尽可能多的提升在线浏览和阅读体验。
                                </li>
                                <li style="margin-bottom: 0.8rem; /* PC端 */
                                         position: relative;
                                         list-style-type: none;
                                         /* 移动端适配 */
                                         @media (max-width: 768px) {
                                             margin-bottom: 0.6rem;
                                         }">
                                    <span style="position: absolute;
                                               left: -1.8rem; /* PC端 */
                                               color: #6cc70b;
                                               /* 移动端适配 */
                                               @media (max-width: 768px) {
                                                   left: -1.5rem;
                                               }">◆</span>
                                    <span style="font-weight: bolder;">友链完善：</span>持续优化完善友链页面，整理归档个人常用的高质量网站合集，无偿分享给有缘人。
                                </li>
                                <li style="margin-bottom: 0.8rem; /* PC端 */
                                         position: relative;
                                         list-style-type: none;
                                         /* 移动端适配 */
                                         @media (max-width: 768px) {
                                             margin-bottom: 0.6rem;
                                         }">
                                    <span style="position: absolute;
                                               left: -1.8rem; /* PC端 */
                                               color: #6cc70b;
                                               /* 移动端适配 */
                                               @media (max-width: 768px) {
                                                   left: -1.5rem;
                                               }">◆</span>
                                    <span style="font-weight: bolder;">音乐餐厅：</span>历经十余小时不间断调研和尝试，本站成功上线”音乐餐厅”功能，目前仅收录了个人在QQ音乐平台积累的两份歌单，再匆忙也要记得点播一首喜欢的音乐，没有音乐熏陶的心灵终究是充满缺憾的。
                                </li>
                                <li style="margin-bottom: 0.8rem; /* PC端 */
                                         position: relative;
                                         list-style-type: none;
                                         /* 移动端适配 */
                                         @media (max-width: 768px) {
                                             margin-bottom: 0.6rem;
                                         }">
                                    <span style="position: absolute;
                                               left: -1.8rem; /* PC端 */
                                               color: #6cc70b;
                                               /* 移动端适配 */
                                               @media (max-width: 768px) {
                                                   left: -1.5rem;
                                               }">◆</span>
                                    <span style="font-weight: bolder;">三言两语：</span>每张照片都是时光的便签，随手一贴就记下了那天，本站结合Mamos实现并注入留言板功能，随缘记录那些藏在照片背后的故事。
                                </li>
                                <li style="margin-bottom: 0.8rem; /* PC端 */
                                         position: relative;
                                         list-style-type: none;
                                         /* 移动端适配 */
                                         @media (max-width: 768px) {
                                             margin-bottom: 0.6rem;
                                         }">
                                    <span style="position: absolute;
                                               left: -1.8rem; /* PC端 */
                                               color: #6cc70b;
                                               /* 移动端适配 */
                                               @media (max-width: 768px) {
                                                   left: -1.5rem;
                                               }">◆</span>
                                    <span style="font-weight: bolder;">旧梦轻拾：</span>更新全站博客文章所属分类，共设有代码锋芒、部署之道、旧梦轻拾、人间片刻等十余种分类。
                                </li>
                                <li style="margin-bottom: 0.8rem; /* PC端 */
                                         position: relative;
                                         list-style-type: none;
                                         /* 移动端适配 */
                                         @media (max-width: 768px) {
                                             margin-bottom: 0.6rem;
                                         }">
                                    <span style="position: absolute;
                                               left: -1.8rem; /* PC端 */
                                               color: #6cc70b;
                                               /* 移动端适配 */
                                               @media (max-width: 768px) {
                                                   left: -1.5rem;
                                               }">◆</span>
                                    <span style="font-weight: bolder;">方寸之间：</span>博客应用版发布，更便捷的阅读体验来了！现已正式推出独立的桌面应用程序与移动端应用程序，暂时通过网盘和代码库提供安装包。
                                </li>
                                <p style="margin-bottom: 0; text-align: right; font-size: 0.9rem; color: #8a8a8a;">
                                    此公告最后更新于：<span style="color: #6cc70b;">2025/09/30晚</span>
                                </p>
                            </ul>
                        </div>
                    </div>
                </div>
            </div>

            <!-- 公告页脚 - 响应式设计 -->
            <div class="modal-footer"
                 style="border-top: 1px solid rgba(255,255,255,0.2);
                        padding: 1rem 1.5rem; /* PC端 */
                        justify-content: space-between;
                        /* 移动端适配 */
                        @media (max-width: 768px) {
                            padding: 0.8rem;
                        }">
                <small style="color: #ffffff;
                            font-size: 0.9rem; /* PC端 */
                            /* 移动端适配 */
                            @media (max-width: 768px) {
                                font-size: 0.8rem;
                            }">
                    <i class="iconfont icon-pen"></i>
                    <i class="fas fa-info-circle mr-1"></i>芒种前夕 · 旅途第813天
                    · 2025/05/28
                </small>
                <button id="confirm-btn" type="button" class="btn btn-sm" data-dismiss="modal"
                        style="background: #a0a0a0;
                               color: #ffffff;
                               border-radius: 4px;
                               padding: 0.5rem 1.2rem; /* PC端 */
                               border: none;
                               font-size: 0.9rem;
                               /* 移动端适配 */
                               @media (max-width: 768px) {
                                   padding: 0.3rem 0.8rem;
                                   font-size: 0.85rem;
                               }">
                    <i class="fas fa-check mr-1" style="color: #ffffff;">心已阅</i>
                </button>
            </div>
        </div>
    </div>
</div>

<style>
  .notice-title {
    display: flex;
    align-items: center;
    white-space: nowrap;
  }

  .notice-title:before,
  .notice-title:after {
    content: "";
    flex: 1;
    height: 1px;
    background: #ddd; /* 横线颜色 */
    margin: 0 10px; /* 横线与文字的间距 */
  }
</style>


<style>
  /* 响应式模态框宽度 */
  @media (min-width: 992px) {
    #modalNotice .modal-dialog {
      max-width: 800px;
    }
  }

  @media (max-width: 991px) {
    #modalNotice .modal-dialog {
      margin: 0.5rem auto;
    }
  }
</style>

<script>
  // 页面加载完成后执行
  document.addEventListener('DOMContentLoaded', function () {
    // 检查是否首次访问
    if (!localStorage.getItem('hasShownPopup')) {
      // 动态加载notice.ejs内容
      fetch('_partials/notice.ejs')  // 替换为实际路径
        .then(response => response.text())
        .then(html => {
          // 插入到页面body末尾
          document.body.insertAdjacentHTML('beforeend', html);

          // 手动初始化Bootstrap模态框
          $('#modalNotice').modal('show');

          // 标记为已显示
          localStorage.setItem('hasShownPopup', 'true');

          // 监听关闭事件
          $('#modalNotice').on('hidden.bs.modal', function () {
            // 可选的后续处理
          });
        })
        .catch(error => {
          console.error('加载公告栏失败:', error);
          // 备用方案：显示简单弹窗
          const fallbackHTML = `
                <div class="modal-backdrop" style="/* 样式 */">
                    <div class="modal-content">/* 内容 */</div>
                </div>`;
          document.body.insertAdjacentHTML('beforeend', fallbackHTML);
        });
    }
  });
</script>

    

    
  </main>

  <footer>
    <!-- 博客 - 页脚 -->
<div class="footer-inner">
  
    <div class="footer-content">
       <a href="https://hexo.fluid-dev.com/docs/guide/" target="_blank" rel="nofollow noopener"> <span>Memory | 个人文档站点</span> </a>
<i class="iconfont icon-love"></i> <a href="https://hexo.fluid-dev.com/docs/guide/" target="_blank" rel="nofollow noopener"> <span>配置指南 | Hexo Fluid 用户手册</span> </a> 
    </div>
  

  

  
    <!-- 备案信 ICP for China -->
    <div class="beian">
  <span>
    <a href="http://beian.miit.gov.cn/" target="_blank" rel="nofollow noopener">
      京ICP证123456号
    </a>
  </span>
  
    
      <span>
        <a
          href="http://www.beian.gov.cn/portal/registerSystemInfo?recordcode=12345678"
          rel="nofollow noopener"
          class="beian-police"
          target="_blank"
        >
          
            <span style="visibility: hidden; width: 0">|</span>
            <img src="/blog/img/police_beian.png" alt="police-icon"/>
          
          <span>京公网安备12345678号</span>
        </a>
      </span>
    
  
</div>

  

  

</div>

<!-- 评论框美化 -->
<style>
    #comments .veditor{
        min-height: 20vh;
        background-image: url(http://blog.memory-life.icu/pathway0716.jpg);
        background-size: contain;
        background-repeat: no-repeat;
        background-position: right;
        background-color: rgba(255,255,255,0);
        resize: none;}
</style>

<script>
    //   自定义邮箱审核规则
    document.body.addEventListener('click', function(e) {
        if (e.target.classList.contains('vsubmit')) {
            const email = document.querySelector('input[type=email]');
            const nick = document.querySelector('input[name=nick]');
            const reg = /^[A-Za-z0-9\u4e00-\u9fa5]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$/;
            if (!email.value || !nick.value || !reg.test(email.value)) {
                const str = `<div class="valert text-center"><div class="vtext">请填写正确的昵称和邮箱！</div></div>`;
                const vmark = document.querySelector('.vmark');
                vmark.innerHTML = str;
                vmark.style.display = 'block';
                setTimeout(function() {
                    vmark.style.display = 'none';
                    vmark.innerHTML = '';
                }, 2500);
            }
        }
    })
</script>



  </footer>

  <!-- Scripts -->
  
  <script  src="https://lib.baomitu.com/nprogress/0.2.0/nprogress.min.js" ></script>
  <link  rel="stylesheet" href="https://lib.baomitu.com/nprogress/0.2.0/nprogress.min.css" />

  <script>
    NProgress.configure({"showSpinner":false,"trickleSpeed":100})
    NProgress.start()
    window.addEventListener('load', function() {
      NProgress.done();
    })
  </script>


<script  src="https://lib.baomitu.com/jquery/3.6.0/jquery.min.js" ></script>
<script  src="https://lib.baomitu.com/twitter-bootstrap/4.6.1/js/bootstrap.min.js" ></script>
<script  src="/blog/js/events.js" ></script>
<script  src="/blog/js/plugins.js" ></script>


  <script  src="https://lib.baomitu.com/typed.js/2.0.12/typed.min.js" ></script>
  <script>
    (function (window, document) {
      var typing = Fluid.plugins.typing;
      var subtitle = document.getElementById('subtitle');
      if (!subtitle || !typing) {
        return;
      }
      var text = subtitle.getAttribute('data-typed-text');
      
        typing(text);
      
    })(window, document);
  </script>







  
<script>
  Fluid.utils.createScript('https://lib.baomitu.com/tocbot/4.18.2/tocbot.min.js', function() {
    var toc = jQuery('#toc');
    if (toc.length === 0 || !window.tocbot) { return; }
    var boardCtn = jQuery('#board-ctn');
    var boardTop = boardCtn.offset().top;

    window.tocbot.init(Object.assign({
      tocSelector     : '#toc-body',
      contentSelector : '.markdown-body',
      linkClass       : 'tocbot-link',
      activeLinkClass : 'tocbot-active-link',
      listClass       : 'tocbot-list',
      isCollapsedClass: 'tocbot-is-collapsed',
      collapsibleClass: 'tocbot-is-collapsible',
      scrollSmooth    : true,
      includeTitleTags: true,
      headingsOffset  : -boardTop,
    }, CONFIG.toc));
    if (toc.find('.toc-list-item').length > 0) {
      toc.css('visibility', 'visible');
    }

    Fluid.events.registerRefreshCallback(function() {
      if ('tocbot' in window) {
        tocbot.refresh();
        var toc = jQuery('#toc');
        if (toc.length === 0 || !tocbot) {
          return;
        }
        if (toc.find('.toc-list-item').length > 0) {
          toc.css('visibility', 'visible');
        }
      }
    });
  });
</script>


  <script src=https://lib.baomitu.com/clipboard.js/2.0.11/clipboard.min.js></script>

  <script>Fluid.plugins.codeWidget();</script>


  
<script>
  Fluid.utils.createScript('https://lib.baomitu.com/anchor-js/4.3.1/anchor.min.js', function() {
    window.anchors.options = {
      placement: CONFIG.anchorjs.placement,
      visible  : CONFIG.anchorjs.visible
    };
    if (CONFIG.anchorjs.icon) {
      window.anchors.options.icon = CONFIG.anchorjs.icon;
    }
    var el = (CONFIG.anchorjs.element || 'h1,h2,h3,h4,h5,h6').split(',');
    var res = [];
    for (var item of el) {
      res.push('.markdown-body > ' + item.trim());
    }
    if (CONFIG.anchorjs.placement === 'left') {
      window.anchors.options.class = 'anchorjs-link-left';
    }
    window.anchors.add(res.join(', '));

    Fluid.events.registerRefreshCallback(function() {
      if ('anchors' in window) {
        anchors.removeAll();
        var el = (CONFIG.anchorjs.element || 'h1,h2,h3,h4,h5,h6').split(',');
        var res = [];
        for (var item of el) {
          res.push('.markdown-body > ' + item.trim());
        }
        if (CONFIG.anchorjs.placement === 'left') {
          anchors.options.class = 'anchorjs-link-left';
        }
        anchors.add(res.join(', '));
      }
    });
  });
</script>


  
<script>
  Fluid.utils.createScript('https://lib.baomitu.com/fancybox/3.5.7/jquery.fancybox.min.js', function() {
    Fluid.plugins.fancyBox();
  });
</script>


  <script>Fluid.plugins.imageCaption();</script>

  <script  src="/blog/js/local-search.js" ></script>

  <script defer src="/blog/js/leancloud.js" ></script>




    
<script src="https://cdn.jsdelivr.net/npm/aplayer@1.10.1/dist/APlayer.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/meting@2/dist/Meting.min.js"></script>



<!-- 主题的启动项，将它保持在最底部 -->
<!-- the boot of the theme, keep it at the bottom -->
<script  src="/blog/js/boot.js" ></script>


  

  <noscript>
    <div class="noscript-warning">博客在允许 JavaScript 运行的环境下浏览效果更佳</div>
  </noscript>
</body>
</html>
